70pts求助……
查看原帖
70pts求助……
367387
cainiaoshanglu楼主2022/4/30 15:37

rt

#include <cstdio>
#include <cstring>
#include <algorithm> 
#include <queue>
#include <vector>
#define int long long
using namespace std;

void read(int &x){
	x=0;
	char c=getchar();
	while(!('0'<=c && c<='9')){
		c=getchar();
	}
	while('0'<=c && c<='9'){
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
}
struct Edge{
	int to,nxt;
	Edge(){}
	Edge(int t,int nx){
		to=t;
		nxt=nx;
	}
} e[400010];
int hs[200010],tot=-1;
void add(int u,int v){
	e[++tot]=Edge(v,hs[u]);
	hs[u]=tot;
}
int sgt[800010],res[200010];
struct Query{
	int u,id;
	Query(){}
	Query(int uu,int i){
		u=uu;
		id=i;
	}
};
vector<Query> qs[200010];
int tr[200010][26],nxt[200010],trie[200010][26],cnt=0,pos[200010],dfn[200010],dfc=0,en[200010];
int siz[200010];
void insert(char *s,int id){
	int cur=0;
	for(int i=0;s[i];i++){
		s[i]-='a';
		if(!tr[cur][s[i]]){
			tr[cur][s[i]]=++cnt;
		}
		cur=tr[cur][s[i]];
		s[i]+='a';
	}
	pos[cur]=id;
	en[id]=cur;
}
void build(){
	queue<int> q;
	memcpy(trie,tr,sizeof(tr));
	for(int i=0;i<26;i++){
		if(tr[0][i]){
			q.push(tr[0][i]);
		}
	}
	while(q.size()){
		int f=q.front();
		q.pop();
		for(int i=0;i<26;i++){
			if(tr[f][i]){
				nxt[tr[f][i]]=tr[nxt[f]][i];
				q.push(tr[f][i]);
			}else{
				tr[f][i]=tr[nxt[f]][i];
			}
		}
	}
}
void update(int p,int v){
	for(int i=p;i<=dfc;i+=(i&(-i))){
		sgt[i]+=v;
	}
}
int query(int p){
	int res=0;
	for(int i=p;i;i-=(i&(-i))){
		res+=sgt[i];
	}
	return res;
}
void dfs(int k){
	dfn[k]=++dfc;
	siz[k]=1;
	for(int i=hs[k];~i;i=e[i].nxt){
		dfs(e[i].to);
		siz[k]+=siz[e[i].to];
	}
}
void dfs2(int k){
	update(dfn[k],1);
	if(pos[k]){
		for(int i=0;i<qs[pos[k]].size();i++){
			int v=en[qs[pos[k]][i].u];
			res[qs[pos[k]][i].id]=query(dfn[v]+siz[v]-1)-query(dfn[v]-1);
		}
	}
	for(int i=0;i<26;i++){
		if(trie[k][i]){
			dfs2(trie[k][i]);
		}
	}
	update(dfn[k],-1);
}
void query(){
	for(int i=1;i<=cnt;i++){
		add(nxt[i],i);
	}
	dfs(0);
	dfs2(0);
}
char str[200010];
int len=0,n;
signed main(){
	int cur=0;
	memset(hs,-1,sizeof(hs));
	while(true){
		char c=getchar();
		if(c=='B'){
			len--;
		}else if(c=='P'){
			str[len]=0;
			insert(str,++cur);
		}else if(c=='\n'){
			break;
		}else{
			str[len++]=c;
		}
	}
	read(n);
	int u,v;
	for(int i=1;i<=n;i++){
		read(u);
		read(v);
		qs[v].push_back(Query(u,i));
	}
	build();
	query();
	for(int i=1;i<=n;i++){
		printf("%lld\n",res[i]);
	}
	return 0;
}
2022/4/30 15:37
加载中...