MnZn AC自动机求调,码风良好(也许
查看原帖
MnZn AC自动机求调,码风良好(也许
750163
_Kenma_楼主2024/7/12 19:13

应该是某些答案算少了,但是我不知道哪里算少了

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,len,x,y;
char s[1000005],t[1000005];
int head[1000005],nxt[2000005],target[2000005],tot;
void add(int x,int y){
	tot++;
	nxt[tot]=head[x];
	head[x]=tot;
	target[tot]=y;
}
struct node{
	int id,y;
};
vector<node> v[1000005];
int son[200005][26],tp[200005][26],fail[2000005],nd[2000005],ccnt;
queue<int> q;
void insert(char *s,int len,int id){
	int x=0;
	for(int i=1;i<=len;i++){
		if(!son[x][s[i]-'a']) son[x][s[i]-'a']=++ccnt;
		x=son[x][s[i]-'a'];
	}
	nd[id]=x;
}
void get_fail(){
	for(int i=0;i<26;i++){
		if(son[0][i]) q.push(son[0][i]);
	}
	while(q.size()){
		int x=q.front();
		q.pop();
		for(int i=0;i<26;i++){
			if(son[x][i]){
				fail[son[x][i]]=son[fail[x]][i];
				q.push(son[x][i]);
			}else{
				son[x][i]=son[fail[x]][i];
			}
		}
	}
}
int val[2000005],ls[2000005],rs[2000005],dcnt;
void pushup(int x){
	val[x]=val[ls[x]]+val[rs[x]];
}
void build(int l,int r,int &x){
	x=++dcnt;
	if(l==r){
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,ls[x]);
	build(mid+1,r,rs[x]);
	pushup(x);
}
void modify(int l,int r,int pos,int k,int x){
	if(l==r){
		val[x]+=k;
		return; 
	}
	int mid=(l+r)>>1;
	if(pos<=mid) modify(l,mid,pos,k,ls[x]);
	else modify(mid+1,r,pos,k,rs[x]);
	pushup(x);
}
int query(int l,int r,int ql,int qr,int x){
	if(ql<=l && r<=qr) return val[x];
	int mid=(l+r)>>1,ans=0;
	if(ql<=mid) ans+=query(l,mid,ql,qr,ls[x]);
	if(qr>=mid+1) ans+=query(mid+1,r,ql,qr,rs[x]);
	return ans;
}
int size[1000005],dfn[10000005],low[100005],cnt;
void dfs_fail(int x,int fa){
	dfn[x]=++cnt;
	for(int i=head[x];i;i=nxt[i]){
		int y=target[i];
		if(y==fa) continue;
		dfs_fail(y,x);
	}
	low[x]=cnt;
}
int ans[1000005];
void dfs_trie(int x){
	modify(1,ccnt,dfn[x],1,1);
	if(v[x].size()){
		for(int j=0;j<v[x].size();j++){
			node tp=v[x][j];
			int id=tp.id,y=tp.y;
			ans[id]=query(1,ccnt,dfn[y],low[y],1); 
		}
	}
	for(int i=0;i<26;i++){
		if(!son[x][i]) continue;
		dfs_trie(son[x][i]);
	}
	modify(1,ccnt,dfn[x],-1,1);
} 
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>t+1;
	for(int i=1;t[i];i++){
		if(t[i]=='P'){
			n++;
			insert(s,len,n);
		}else if(t[i]=='B'){
			len--;
		}else{
			s[++len]=t[i];
		}
	}
	memcpy(tp,son,sizeof(tp));
	get_fail();
	memcpy(son,tp,sizeof(son));
	cout<<endl;
	for(int i=1;i<=ccnt;i++){
		add(fail[i],i);
		add(i,fail[i]);
		//cout<<i<<" "<<fail[i]<<endl;
	}
	dfs_fail(0,0);
	build(1,ccnt,x);
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		v[nd[y]].push_back({i,x});
	}
	dfs_trie(0); 
	for(int i=1;i<=m;i++){
		cout<<ans[i]<<'\n';
	}
	return 0;
}
/*
a
aa
ab
aba
ba
baa
bb
bba
*/
2024/7/12 19:13
加载中...