傻逼多组测试,想了很久不知道为什么wa,结果是多组测试
ac自动机很多时候就是对End数组的操作,这题是用End数组记录末尾的字符串,query的时候sum综合一下End数组
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pii pair<int,int> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=50000+10,maxn=60000+10,inf=0x3f3f3f; int sum[1000+10]; struct Trie{ int tot,root,End[N]; int Next[N][95],fail[N]; int newnode() { for(int i=0;i<95;i++) Next[tot][i]=-1; End[tot]=0; return tot++; } void init() { tot=0; root=newnode(); memset(sum,0,sizeof sum); } void insertstring(char *s,int k) { int now=root,len=strlen(s); for(int i=0;i<len;i++) { if(Next[now][s[i]-' ']==-1) Next[now][s[i]-' ']=newnode(); now=Next[now][s[i]-' ']; } End[now]=k; } void build() { queue<int>q; fail[root]=root; for(int i=0;i<95;i++) { if(Next[root][i]==-1)Next[root][i]=root; else { fail[Next[root][i]]=root; q.push(Next[root][i]); } } while(!q.empty()) { int now=q.front(); q.pop(); for(int i=0;i<95;i++) { if(Next[now][i]==-1)Next[now][i]=Next[fail[now]][i]; else { fail[Next[now][i]]=Next[fail[now]][i]; q.push(Next[now][i]); } } } } void query(char *s) { int now=root,len=strlen(s); for(int i=0;i<len;i++) { now=Next[now][s[i]-' ']; int temp=now; while(temp!=root) { sum[End[temp]]++; temp=fail[temp]; } } } }; Trie ac; char a[1000+10][50+10]; char s[2000000+10]; int main() { /*ios::sync_with_stdio(false); cin.tie(0);*/ int n; while(~scanf("%d",&n)) { ac.init(); for(int i=1; i<=n; i++) { scanf("%s",&a[i]); ac.insertstring(a[i],i); } ac.build(); getchar(); char p; int cnt=0; memset(s,0,sizeof s); while((p=getchar())!=' ')s[cnt++]=p; ac.query(s); for(int i=1; i<=n; i++) { if(sum[i]==0)continue; printf("%s: %d ",a[i],sum[i]); } } return 0; } /******************** 3 AA BB C ooxxCC%dA AAoen....END ********************/