• uva 1449


    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 }
  • 相关阅读:
    Spring自定义注解简单使用四步走
    关于Mybaits映射一点心得
    设置UIButton文字大小颜色不同
    AFNetworking上传文件
    解决UITableView头部空白
    iOS获取文件和文件夹大小
    编译ffmpeg(iOS)
    让MySql支持Emoji表情
    MySQL重置密码(OSX)
    iOS多线程总结
  • 原文地址:https://www.cnblogs.com/sooflow/p/3366446.html
Copyright © 2020-2023  润新知