AC自动机,坑爹的不晓得为什么G++无线TLE,C++AC
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
#define MAXN 50005
#define MAXS 2000005
#define MAXX 26
int vis[1005],tag[1005];
struct acauto
{
queue<int> q;
int ch[MAXN][MAXX],fail[MAXN],last[MAXN];
int val[MAXN];
int sz;
void ini(){sz=1;memset(ch[0],0,sizeof(ch[0]));}
int idx(char c) {return c-'A';}
void insert(char *s,int v)
{
int pre=0,len=strlen(s);
for(int i=0;i<len;i++)
{
int next=idx(s[i]);
if(!ch[pre][next])
{
memset(ch[sz],0,sizeof(ch[0]));
val[sz]=0;
ch[pre][next]=sz++;
}
pre=ch[pre][next];
}
val[pre]=v;
}
void print(int pre)
{
if(pre)//&&!tag[pre])
{
//tag[pre]=1;
vis[val[pre]]++;
print(last[pre]);
}
}
void find(char *s)
{
memset(vis,0,sizeof(vis));
int len=strlen(s),pre=0;
for(int i=0;i<len;i++)
{
if(s[i]<'A'||s[i]>'Z') {pre=0;continue;}
int next=idx(s[i]);
pre=ch[pre][next];
if(val[pre])
{
//memset(tag,0,sizeof(tag));
print(pre);
}
else if(last[pre])
{
//memset(tag,0,sizeof(tag));
print(last[pre]);
}
}
}
void getfail()
{
while(!q.empty()) q.pop();
fail[0]=0;
for(int next=0;next<MAXX;next++)
{
int u=ch[0][next];
if(u) {fail[u]=0;q.push(u);last[u]=0;}
}
while(!q.empty())
{
int pre=q.front();
q.pop();
for(int next=0;next<MAXX;next++)
{
int u=ch[pre][next];
if(!u) {ch[pre][next]=ch[fail[pre]][next];continue;}
q.push(u);
int v=fail[pre];
fail[u]=ch[v][next];
last[u]=val[fail[u]]?fail[u]:last[fail[u]];
}
}
}
};
char s[MAXS],t[1000][60];
acauto ac;
int n;
int main()
{
while(scanf("%d",&n)!=EOF)
{
ac.ini();
for(int i=1;i<=n;i++)
{
scanf("%s",t[i]);
ac.insert(t[i],i);
}
ac.getfail();
scanf("%s",s);
ac.find(s);
for(int i=1;i<=n;i++)
{
if(vis[i])
printf("%s: %d\n",t[i],vis[i]);
}
}
return 0;
}