ABC 250 E
E - Prefix Equality(哈希)
题意
给定两个等长数组a,b,每次询问a的前x个元素组成的集合是否等于b的前y个元素组成的集合
思路
因为它有个限制条件,区间都是[1,x],所以轻松一点,要是询问a的某一段区间与b的某一段区间相等,就不会做了。
直接上哈希,自然溢出。
代码
vector<int> a,b;
vector<ull> ha,hb;
ull q_pow(int a,int b)
{
ull res=1;
while(b)
{
if(b&1) res=res*a;
a=a*a;
b/=2;
}
return res;
}
vector<ull> hash_(vector<int>&a)
{
int len=a.size();
ull h=0;
vector<ull> hash(n);
set<ull> s;
for(int i=0;i<len;i++)
{
if(!s.count(a[i]))
{
s.insert(a[i]);
h+=q_pow(mod,a[i]);
}
hash[i]=h;
}
return hash;
}
void solve()
{
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
a.push_back(x);
}
for(int i=0;i<n;i++)
{
int x;
cin>>x;
b.push_back(x);
}
ha=hash_(a);
hb=hash_(b);
cin>>m;
while(m--)
{
int x,y;
cin>>x>>y;
--x,--y;
if(ha[x]==hb[y]) cout<<"Yes\n";
else cout<<"No\n";
}
}