ac自动机
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 const int maxnode=150*70+5; 7 char s[155][75]; 8 char in[1000000+5]; 9 struct Trie 10 { 11 int ch[maxnode][26]; 12 int val[maxnode]; 13 int f[maxnode]; 14 int cnt[155]; 15 int sz; 16 void initial() 17 { 18 sz=1; 19 memset(ch[0],0,sizeof(ch[0])); 20 memset(val,0,sizeof(val)); 21 memset(cnt,0,sizeof(cnt)); 22 } 23 void insert(char *s,int v) 24 { 25 int len=strlen(s); 26 int u=0; 27 for(int i=0;i<len;i++) 28 { 29 int c=s[i]-'a'; 30 if(!ch[u][c]) 31 { 32 memset(ch[sz],0,sizeof(ch[sz])); 33 ch[u][c]=sz++; 34 } 35 u=ch[u][c]; 36 } 37 val[u]=v; 38 } 39 void get_fail() 40 { 41 queue<int> q; 42 f[0]=0; 43 for(int i=0;i<26;i++) 44 { 45 int u=ch[0][i]; 46 if(u) 47 { 48 q.push(u);f[u]=0; 49 } 50 } 51 while(!q.empty()) 52 { 53 int r=q.front(); 54 q.pop(); 55 for(int c=0;c<26;c++) 56 { 57 int u=ch[r][c]; 58 if(!u) continue; 59 q.push(u); 60 int v=f[r]; 61 while(v&&!ch[v][c]) v=f[v]; 62 f[u]=ch[v][c]; 63 } 64 } 65 } 66 void solve(char *s,char in[][75],int n) 67 { 68 get_fail(); 69 int len=strlen(s); 70 int u=0; 71 for(int i=0;i<len;i++) 72 { 73 int c=s[i]-'a'; 74 while(u&&!ch[u][c]) u=f[u]; 75 u=ch[u][c]; 76 int tmp=u; 77 while(tmp) 78 { 79 cnt[val[tmp]]++; 80 tmp=f[tmp]; 81 } 82 } 83 int MAX=cnt[1]; 84 for(int i=2;i<=n;i++) 85 if(MAX<cnt[i]){MAX=cnt[i];} 86 vector<int> ans; 87 for(int i=1;i<=n;i++) 88 if(cnt[i]==MAX) {ans.push_back(i);} 89 printf("%d ",MAX); 90 for(int i=0;i<ans.size();i++) 91 printf("%s ",in[ans[i]]); 92 } 93 }; 94 Trie trie; 95 int main() 96 { 97 int n; 98 while(scanf("%d",&n)&&n) 99 { 100 trie.initial(); 101 for(int i=1;i<=n;i++) 102 { 103 scanf("%s",s[i]); 104 trie.insert(s[i],i); 105 } 106 scanf("%s",in); 107 trie.solve(in,s,n); 108 } 109 return 0; 110 }