uva 1449 - Dominating Patterns

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\n",MAX);
 90         for(int i=0;i<ans.size();i++)
 91             printf("%s\n",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 }

 

posted @ 2013-10-13 11:02  sooflow  阅读(232)  评论(0编辑  收藏  举报