C 诗
C 诗
我们考虑哈希。
对于每个询问,来了就哈希,然后排序,这样对于之后每个同是这个长度的串,就可以直接查询。
由于不同的串长最多是 \(1+2+3+\dots\),大概是 \(\sqrt n\) 的级别,每组瓶颈都是预处理,最多预处理 \(\sqrt n\) 次,加排序,那么复杂度就是 \(O(n\sqrt n\log n)\)。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define Le(i,l,r) for(int i=l;i<=r;++i)
#define Re(i,l,r) for(int i=l;i>=r;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define E(i,l) for(int i=1;i<=l;++i)
#define W(t) while(t--)
#define Wh while
const int N=100010,P=131;
typedef unsigned long long ull;
int op,n,q,a[N];
ull hs[N],p[N]{1ull};
vector<ull>g[N];
ull get(int l,int r){
// cout<<hs[r]<<' '<<hs[l-1]<<'\n';
return hs[r]-hs[l-1]*p[r-l+1];
}
int main(){
#ifdef ONLINE_JUDGE
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
#endif
cin>>op>>n>>q;
E(i, n)cin>>a[i];
E(i, n)hs[i]=hs[i-1]*P+a[i],p[i]=p[i-1]*P;//,cout<<hs[i]<<' ';
// cout<<'\n';
// cout<<get(4,5);
// return 0;
// cout<<p[1]<<'\n';
int lst=0;
W(q){
int len;
cin>>len;
vector<ull>&now=g[len];
if(now.empty()){
E(i, n-len+1)now.push_back(get(i,i+len-1));
sort(now.begin(),now.end());
// for(ull v:now)cout<<v<<' ';
// cout<<'\n';
}
ull has=0;
E(i, len){
int x;
cin>>x;
has=has*P+(op?x^lst:x);
}
// printf("has=%llu\n",has);
int l=lower_bound(now.begin(),now.end(),has)-now.begin();
int r=upper_bound(now.begin(),now.end(),has)-now.begin()-1;
lst=l<=r?r-l+1:0;
cout<<lst<<'\n';
}
return 0;
}