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;
}
posted @ 2023-11-17 12:56  wscqwq  阅读(1)  评论(0编辑  收藏  举报