WA 60pts On #1#4#5#10
查看原帖
WA 60pts On #1#4#5#10
749714
xyzfrozen楼主2023/7/26 11:56
#include<bits/stdc++.h>
#define pt putchar(' ')
#define nl puts("")
#define pi pair<int,int>
#define pb push_back
#define go(it) for(auto &it:as[x])
using namespace std;

const int N=4e6+10;
int n,m,op,idx,stm;
char s[N];
int fa[N],dep[N],son[N],sz[N],top[N],dfn[N],dot[N];
vector<int> as[N];

int fr(){
    int x=0,flag=1;
    char ch=getchar();
    while(ch<'0' || ch>'9'){
        if(ch=='-') flag=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9'){
        x=x*10+(ch-'0');
        ch=getchar();
    }
    return x*flag;
}
void fw(int x){
	if(x<0) putchar('-'),x=-x;
    if(x>9) fw(x/10);
    putchar(x%10+'0');
}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
bool cop(int x,int y){return dfn[x]<dfn[y];}

struct Bit{
	int s[N];
	void add(int i,int x){for(;i<=idx;i+=i&(-i)) s[i]+=x;}
	int query(int i)
	{
		int res=0;
		for(;i;i-=i&(-i)) res+=s[i];
		return res;	
	}
}bit;

struct Tree_Sub{
	void init(int x,int rt)
	{
		dep[x]=dep[rt]+1;
		fa[x]=rt,sz[x]=1;
		
		go(v)
		{
			init(v,x);
			sz[x]+=sz[v];
			if(!son[x] || sz[son[x]]<sz[v]) son[x]=v;
		}
	}
	void dfs(int x,int Top)
	{
		dfn[x]=++stm;
		top[x]=Top;
		if(!son[x]) return;
		dfs(son[x],Top);
		go(v) {if(!dfn[v]) dfs(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]];
		}
		if(dep[x]>dep[y]) swap(x,y);
		return x;
	}
}Tr;

struct ACAuto{
	int tr[N][26],ed[N],fail[N];
	void ins(int x)
	{
	    int now=0;
	    for(int i=0;s[i];i++)
	    {
	        int word=s[i]-'a';
	        if(!tr[now][word]) tr[now][word]=++idx;
	        now=tr[now][word];
		}
		ed[x]=now;
	}	
	void getfail()
	{
	    queue<int> q;
	    for(int i=0;i<26;i++) 
	       if(tr[0][i]) q.push(tr[0][i]);
	    
	    while(q.size())
	    {
	        int t=q.front();
	        q.pop();
	        
	        for(int i=0;i<26;i++)
	        {
	            int &now=tr[t][i];
	            if(!now) now=tr[fail[t]][i];
	            else
	            {
	                fail[now]=tr[fail[t]][i];
	                q.push(now);
	            }
	        }
	    }
	}
	void solve()
	{
		scanf("%s",s);
		int now=0,len=0;
		for(int i=0;s[i];i++)
		{
			int word=s[i]-'a';
			now=tr[now][word],dot[++len]=now;
		}
		sort(dot+1,dot+1+len,cop);
		len=unique(dot+1,dot+1+len)-dot-1;
		for(int i=1;i<=len;i++) bit.add(dfn[dot[i]],1);
		for(int i=2;i<=len;i++) bit.add(dfn[Tr.lca(dot[i],dot[i-1])],-1);
	}
}AC;

int main()
{
	n=fr();
	for(int i=1;i<=n;i++) scanf("%s",s),AC.ins(i);
	
	AC.getfail();
	for(int i=1;i<=idx;i++) as[AC.fail[i]].pb(i);
	Tr.init(0,idx+1),Tr.dfs(0,0);
	m=fr();
	for(int i=1;i<=m;i++)
	{
		op=fr();
		if(op&1) AC.solve();
		else
		{
			int x=AC.ed[fr()];
			fw(bit.query(dfn[x]+sz[x]-1)-bit.query(dfn[x]-1)),nl;
		}
	}

	return 0;
}
2023/7/26 11:56
加载中...