RE求调
查看原帖
RE求调
596437
Raisen_zx楼主2024/4/8 16:19

RT,盯真一个下午了还是调不出来,求巨佬帮调

#include<bits/stdc++.h>
using namespace std;
const int MAXN=2000010;
const int N=100010;
struct Trie
{
	int son[26],fail;
}tr[MAXN];
struct Edge
{
	int nxt,to;
}e[MAXN];
int n,q,pos[N],cnte=1,head[MAXN],BIT[MAXN],tmp[MAXN],tot,ask,cnt=1;
int fa[MAXN],pdfn,siz[MAXN],dfn[MAXN],son[MAXN],top[MAXN],dep[MAXN];
int lowbit(int x){
	return x&(-x);
}
int add(int x,int v)
{
	for(;x<=cnt;x+=lowbit(x)) BIT[x]+=v;
}
int query(int x)
{
	int res=0;
	for(;x;x-=lowbit(x)) res+=BIT[x];
	return res;
}
char s[MAXN]; 
inline void add_edge(int u,int v)
{
	e[++cnte].nxt=head[u];
	e[cnte].to=v;
	head[u]=cnte;
	return;
}
inline void insert(char *s,int x)
{
	int p=1;
	int len=strlen(s+1);
	for(int i=1;i<=len;++i)
	{
		int ch=s[i]-'a';
        if(!tr[p].son[ch]) tr[p].son[ch]=++cnt;
		p=tr[p].son[ch];
	}
	pos[x]=p;
	return;
}
inline void build()
{
	queue<int>q;
	for(int i=0;i<26;++i) tr[0].son[i]=1;
	tr[1].fail=0;
    q.push(1);
	while(!q.empty())
	{
		int nw=q.front();
		q.pop();
		for(int i=0;i<26;++i)
		{
			if(tr[nw].son[i])   tr[tr[nw].son[i]].fail=tr[tr[nw].fail].son[i],q.push(tr[nw].son[i]);
			else tr[nw].son[i]=tr[tr[nw].fail].son[i];
		}
	}
} 
void dfs1(int u)
{
	siz[u]=1;
	int ma=0;
	for(int i=head[u],v;~i;i=e[i].nxt)
	{
		v=e[i].to;
		fa[v]=u,dep[v]=dep[u]+1;
		dfs1(v);
		siz[u]+=siz[v];
		if(siz[v]>ma) ma=siz[v],son[u]=v;
	}
	return;
}
void dfs2(int u,int t)
{
	top[u]=t;
	dfn[u]=++pdfn;
	if(son[u]) dfs2(son[u],t);
	for(int i=head[u],v;~i;i=e[i].nxt)
	{
		v=e[i].to;
		if(v!=son[u]) dfs2(v,v);
	}
}
int LCA(int x,int y)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		x=fa[top[x]];
	}
	return dep[x]<dep[y]?x:y;
}
bool cmp(int x,int y)
{
	return dfn[x]<dfn[y];
}
int main()
{
    scanf("%d",&n);
	memset(head,-1,sizeof head);
	for(int i=1;i<=n;++i)
	{
        scanf("%s",s+1);
		insert(s,i);
	}
	scanf("%d",&q);
	build();
	for(int i=2;i<=cnt;++i) add_edge(tr[i].fail,i);
	dep[1]=1;
	dfs1(1);
	dfs2(1,1);
	while(q--)
	{
		int opt;
		scanf("%d",&opt);
		if(opt==1)
		{
			tot=0;
			scanf("%s",s+1);
			int len=strlen(s+1);
			int p=1;
			for(int i=1;i<=len;++i)
			{
				int ch=s[i]-'a';
				p=tr[p].son[ch];
				tmp[i]=p;
			}
			sort(tmp+1,tmp+len+1,cmp);
			// len=unique(tmp+1,tmp+len+1)-tmp-1;
			for(int i=1;i<=len;++i) add(dfn[tmp[i]],1);
			for(int i=2;i<=len;++i) add(dfn[LCA(tmp[i],tmp[i-1])],-1);
		}
		else
		{
			scanf("%d",&ask);
			int p=pos[ask];
			printf("%d\n",query(dfn[p]+siz[p]-1)-query(dfn[p]-1));
		}
	}
	return 0;
}
2024/4/8 16:19
加载中...