zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Android自动填写获取到的验证码
    java 调用mysql存储过程
    TreeMap按照key排序
    Java中的Map List Set等集合类
    Java 多线程 并发编程
    Linux查看端口、进程情况及kill进程
    采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!)
    Wix 安装部署教程(十) --来,用WPF做个漂亮的安装界面
    Jquery Mobile 小结
    岂能尽如人意,但求无愧于心
  • 原文地址:https://www.cnblogs.com/sooflow/p/3366446.html
Copyright © 2011-2022 走看看