首页 > 其他分享 >abc250E 判断集合前缀是否相等

abc250E 判断集合前缀是否相等

时间:2024-03-18 22:55:06浏览次数:31  
标签:const 前缀 int abc250E cin b1 b2 集合

给定数组A[n]和B[n],有Q组询问,每次给出一组(x,y),问A中前x个元素构成的集合是否与B中前y个元素构成的集合相等?
1<=n,q<=2e5; 1<=a[i],b[i]<=1e9; 1<=x[i],y[i]<=n

可以用乘法和异或来实现对集合的哈希,另外需要借助一个set来避免重复元素对哈希结果的影响。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=b;i>=a;i--)

const int b1 = 409, m1 = 1000000409;
const int b2 = 439, m2 = 1000000439;
const int b3 = 433, m3 = 1000000433;
using hval = tuple<int,int,int>;

const int N = 200005;
int n, Q, a[N], b[N];
set<int> st1, st2;
hval A[N], B[N];
void solve() {
    cin >> n;
    rep(i,1,n) {
        cin >> a[i];
        A[i] = A[i-1];
        if (st1.count(a[i]))
            continue;
        st1.insert(a[i]);
        auto [x,y,z] = A[i-1];
        x ^= a[i] * b1;
        y ^= a[i] * b2;
        z ^= a[i] * b3;
        A[i] = {x,y,z};
    }
    rep(i,1,n) {
        cin >> b[i];
        B[i] = B[i-1];
        if (st2.count(b[i]))
            continue;
        st2.insert(b[i]);
        auto [x,y,z] = B[i-1];
        x ^= b[i] * b1;
        y ^= b[i] * b2;
        z ^= b[i] * b3;
        B[i] = {x,y,z};
    }
    cin >> Q;
    while (Q--) {
        int x, y;
        cin >> x >> y;
        if (A[x] == B[y])
            cout << "Yes\n";
        else
            cout << "No\n";
    }
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:const,前缀,int,abc250E,cin,b1,b2,集合
From: https://www.cnblogs.com/chenfy27/p/18081703

相关文章

  • mysql索引(索引失效,遵循最左前缀,使用1.全值匹配 2.覆盖索引,失效:索引加函数,范围查询右边
    1.遵循联合索引最左列原则当表中创建了一个联合索引idx_name_age_position案例演示1.当我们在执行sql语句:以name为where条件时,我们可以用到索引EXPLAINSELECT*FROMemployeesWHEREname='LiLei';2.当我们在执行sql语句:以age为where条件时,索引就会失效......
  • 前缀和与差分
    前缀和:模版题:https://www.luogu.com.cn/problem/P8218二维前缀和:https://www.luogu.com.cn/problem/P2004前缀和应用:https://www.luogu.com.cn/problem/T430521前缀和应用二:https://www.luogu.com.cn/problem/T430522方法一:计算所有k的前缀和,要点:使用vector,效率nlogn其他......
  • Java面试问题集合,Java面试题合集
    前言:说到算法,相信每一个程序员和接触过程序员的朋友都不会陌生,直到现在算法一直占着面试必问的地位,而算法面试也仍是当前最适合公司筛选程序员的方法之一,在阿里,字节跳动、华为等公司带动下,无论是求职者还是面试官,都逐渐认识到算法面试其实是相对高效、准确且公平的筛选机制......
  • [Python初阶]2255.统计是给定字符串前缀的字符串数目
    目录     2255.统计是给定字符串前缀的字符串数目①.题目②.问题分析③.startswith()方法理解与说明Ⅰ.定义和用法 Ⅱ.语法 ④.问题解决⑤总结     2255.统计是给定字符串前缀的字符串数目①.题目②.问题分析需求:统计列表words中,是字......
  • Leecode 最长公共前缀
    Day1刷题此题没有写出来,仅附上力扣官方代码:classSolution{publicStringlongestCommonPrefix(String[]strs){if(strs==null||strs.length==0){return"";}Stringprefix=strs[0];intcount=strs.length;......
  • 【洛谷 P8661】[蓝桥杯 2018 省 B] 日志统计 题解(滑动窗口+优先队列+双端队列+集合)
    [蓝桥杯2018省B]日志统计题目描述小明维护着一个程序员论坛。现在他收集了一份“点赞”日志,日志共有NNN行。其中每一行的格式是tsid,表示在......
  • 二维前缀和知识讲解+例题
    1.二维前缀和二维前缀和是一种数组处理技术,它在处理二维数据(如矩阵)时非常有用。它的概念源自于一维前缀和,但扩展到了两个维度。二维前缀和的主要思想是将矩阵中的每个元素与其上方和左方的元素进行累加,从而快速计算出矩阵中任意子矩阵的元素和。定义如下:设有一个二维矩阵......
  • 政安晨:【深度学习处理实践】(八)—— 表示单词组的两种方法:集合和序列
    咱们接着这个系列的上一篇文章继续:政安晨:【深度学习处理实践】(七)——文本数据预处理https://blog.csdn.net/snowdenkeke/article/details/136697057机器学习模型如何表示单个单词,这是一个相对没有争议的问题:它是分类特征(来自预定义集合的值),我们知道如何处理。它应该被编码......
  • java集合框架——Collection集合概述
    前言之前学过ArrayList,现在接触到更多集合了。整理下笔记,打好基础,daydayup! 集合体系结构集合分为单列结合和双列结合,Collection代表单列集合,每个元素只包含一个值。Map代表双列集合,每个元素包含两个值。(本篇主要说明Collection集合) Collection集合Collection集合......
  • java集合框架——List集合概述及ArrayList,LinkedList的区别
    前言:List系列集合是Collection集合中两个系列的其中一个,整理下笔记。打好基础,daydayup!需要了解Collection的,可以看这篇java集合框架——Collection集合概述  List系列集合List系列集合的特点为添加的元素有序,可重复,有索引。在继承了Collection方法的基础上,有很多索引......