求助玄关
查看原帖
求助玄关
812955
System_Error_/se楼主2024/8/8 16:11
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
string s,str[N];
vector<pair<int,int>> ve[N];
int q,ch[N][26],tmp[N][26],fail[N],id[N],dfn[N],sz[N],t[N],ans[N],tot=0,cnt=0,num=0;
int head[N],sum=0;
struct node {int to,nxt;}e[N];
void add(int u,int v) {e[++sum]=(node){v,head[u]};head[u]=sum;}
void insert(string s,int p) {
	int cur=0;
	for(int i=0; i<s.size(); i++) {
		if(!ch[cur][s[i]-'a']) ch[cur][s[i]-'a']=tmp[cur][s[i]-'a']=++tot;
		cur=ch[cur][s[i]-'a'];
	}
	id[p]=cur;
}
void build_fail() {
	queue<int> q;
	for(int i=0; i<26; i++) if(ch[0][i]) q.push(ch[0][i]);
	while(!q.empty()) {
		int u=q.front();
		q.pop();
		for(int i=0; i<26; i++) {
			if(ch[u][i]) fail[ch[u][i]]=ch[fail[u]][i],q.push(ch[u][i]);
			else ch[u][i]=ch[fail[u]][i];
		}
	}
}
void dfs1(int u) {
	dfn[u]=++cnt,sz[u]=1;
	for(int i=head[u]; ~i; i=e[i].nxt) {
		int v=e[i].to;
		dfs1(v);
		sz[u]+=sz[v];
	}
}
int lowbit(int x) {return x&(-x);}
void ad(int x,int y) {while(x<=cnt) t[x]+=y,x+=lowbit(x);}
int query(int x) {int ans=0;while(x) ans+=t[x],x-=lowbit(x);return ans;}
void dfs2(int u) {
	ad(dfn[u],1);
	for(int i=0; i<ve[u].size(); i++) {
		int fi=ve[u][i].first,se=ve[u][i].second;
		ans[se]=query(dfn[fi]+sz[fi]-1)-query(dfn[fi]-1);
	}
	for(int i=0; i<26; i++) if(tmp[u][i]) dfs2(tmp[u][i]);
	ad(dfn[u],-1);
}
inline int read() {int x=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-') f=-1;c=getchar();}while(isdigit(c)) {x=(x<<3)+(x<<1)+(c^48);c=getchar();}return x*f;}
int main() {
	cin>>s;
	string t="";
	for(int i=0; i<s.size(); i++) {
		if(s[i]=='P') insert(t,++num),str[num]=t;
		else if(s[i]=='B') t.pop_back();
		else t+=s[i];
	}
	build_fail();
	memset(head,-1,sizeof(head));
	for(int i=1; i<=tot; i++) add(fail[i],i);
	dfs1(0);
	q=read();
	for(int i=1; i<=q; i++) {
		int x,y;
		x=read(),y=read();
		ve[id[y]].push_back(make_pair(id[x],i));
	}
	dfs2(0);
	for(int i=1; i<=q; i++) cout<<ans[i]<<endl;
	return 0;
}

mle on 8,9,10

2024/8/8 16:11
加载中...