AC自动机在线求条
查看原帖
AC自动机在线求条
788951
TLE_AK楼主2024/7/22 15:54
#include<bits/stdc++.h>
using namespace std;


namespace acac
{
	int n,m,sz;
	int trie[10000010][5],fail[10000010],Sum[10000010],D[10000010],L[110],bj[10000010];
	char S[100010][110],T[10000010];
	
	int zh(char ch)
	{
		if(ch=='E')return 0;
		if(ch=='S')return 1;
		if(ch=='W')return 2;
		return 3;
	}
	 
	void ins(char S[],int w,int len,int u)
	{
		if(w>len)
		{
			Sum[u]++;
			return ; 
		}	
		int to=zh(S[w]);
		if(!trie[u][to])trie[u][to]=++sz;
		ins(S,w+1,len,trie[u][to]);
	} 
	
	
	void build()
	{
		int l=1,r=0;
		for(int i=0;i<4;i++)
		{
			if(trie[0][i])D[++r]=trie[0][i],fail[trie[0][i]]=0;
		}
		while(l<=r)
		{
			int u=D[l++];
			for(int i=0;i<4;i++)
			{
				if(trie[u][i])
				{
					fail[trie[u][i]]=trie[fail[u]][i];
					D[++r]=trie[u][i];
				}
				else trie[u][i]=trie[fail[u]][i];
			}
		}
		
	}
	 
	void pp(char S[],int w,int len,int u)
	{
		if(u)
		{
			for(int i=u;i&&!bj[i];i=fail[i])
			{
				bj[i]=1;
			}	
		}	
		if(w>len)return ;
		pp(S,w+1,len,trie[u][zh(S[w])]);
	} 
	
	int qr(char S[],int w,int len,int u)
	{
		int ans=0;
		for(int i=1;i<=len;i++)
		{
			u=trie[u][zh(S[i])];
			if(bj[u])ans=i;	
		}
		return ans;
	}
	 
	int main()
	{
		scanf("%d%d%s",&n,&m,T+1);
		for(int i=1;i<=m;i++)
		{
			scanf("%s",S[i]+1);
			L[i]=strlen(S[i]+1);
			ins(S[i],1,L[i],0);
		
		}
		
		build();
		pp(T+1,1,n,0);
		for(int i=1;i<=m;i++)
		{
			cout<<qr(S[i],1,L[i],0)<<'\n';
		}
		return 0;
	}
}

int main()
{
	
	acac::main();
	return 0;
}

2024/7/22 15:54
加载中...