#2错了,求调
查看原帖
#2错了,求调
285617
黑影洞人楼主2023/6/24 17:12
#include<cstdio>
#include<algorithm>
#include<map>
#define ull unsigned long long
#define N 414514
using namespace std;
int seed,md=19260817;
int _rand(){seed=(seed*7%md+13)%md;return seed;}
void _srand(int x){seed=x;}
int n,m,ans;
int a[N],b[N];
ull base=131,h[N],ha[N],sum;
int rt;
bool tag[N];
map<ull,bool>mp;
pair<ull,int> fi[N];
struct fhq_treap{
	int rnd[N],siz[N],tot,ch[N][2];
	ull val[N],key[N];
	#define lc ch[x][0]
	#define rc ch[x][1]
	int newnode(ull v){
		int x=++tot;
		val[x]=key[x]=v;siz[x]=1;
		rnd[x]=_rand();
		return x;
	}
	int pushup(int x){
		siz[x]=siz[lc]+siz[rc]+1;
		key[x]=key[lc]*h[siz[rc]+1]+val[x]*h[siz[rc]]+key[rc];
		return x;
	}
	void split(int p,int k,int &x,int &y){
		if(!p)return void(x=y=0);
		if(k>siz[ch[p][0]])split(ch[x=p][1],k-siz[ch[p][0]]-1,ch[p][1],y);
		else split(ch[y=p][0],k,x,ch[p][0]);
		pushup(p);
	}
	int merge(int x,int y){
		if(!x||!y)return x+y;
		if(rnd[x]<rnd[y]){rc=merge(rc,y);return pushup(x);}
		else{ch[y][0]=merge(x,ch[y][0]);return pushup(y);}
	}
}t;
signed main(){
	_srand(676767);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=1;i<=m;i++)scanf("%d",&b[i]),fi[i]={1ull*b[i],i};
	for(int i=1;i<=m;i++)if(b[i]<=n)tag[i]=b[i];
	if(m<n)return puts("0"),0;
	sum=h[0]=1;
	for(int i=1;i<=m;i++)h[i]=h[i-1]*base,sum+=i<=n?h[i]:0;
	for(int i=1;i<=n;i++)ha[i]=ha[i-1]*base+a[i];
	for(int i=0;i<=m-n;i++)mp[ha[n]+sum*i]=1;
	for(int i=1;i<=m;i++)if(tag[i])rt=t.merge(rt,t.newnode(1ull*b[i]));
	sort(fi+1,fi+m+1);
	for(int i=1;i<=m-n;i++){
		if(mp[t.key[rt]])ans++;
		int a,b,c,val=fi[i].second;
		t.split(rt,val-1,a,b);
		t.split(b,1,b,c);
		rt=t.merge(a,c);
		val=fi[i+n].second;
		t.split(rt,val-1,a,b);
		rt=t.merge(a,t.merge(t.newnode(fi[i+n].first),b));
	}
	if(mp[t.key[rt]])ans++;
	printf("%d\n",ans);
	return 0;
}



2023/6/24 17:12
加载中...