码迷,mamicode.com
首页 > 其他好文 > 详细

AC自动机

时间:2016-08-24 17:10:50      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

输入n个模板串,再输入一个文本串,找到在文本串中出现的模板串,输出这些模板串的序号

 

  1 #include<iostream>
  2 #include<queue>
  3 #include<cstdio>
  4 #include<cstring>
  5 using namespace std;
  6 const int maxm=1024;
  7 //节点数目,模板串数目,文本串长度最多都是1024
  8 struct AC{
  9     char ch[maxm][26];
 10     int book[maxm];
 11     int f[maxm];
 12     int val[maxm];
 13     int last[maxm];
 14     int ans,size,count;
 15     int idx(char c)
 16     {
 17         return c-a;
 18     }
 19     void mark(int j)
 20     {
 21         if(j){
 22             if(!book[val[j]]){
 23                 ans++;
 24                 book[val[j]]=1;
 25                 printf("find:val[j]=%d\n",val[j]);
 26             }
 27             mark(last[j]);
 28         }
 29     }
 30     void getF()
 31     {
 32         queue<int> Q;
 33         f[0]=0;
 34         for(int i=0;i<26;i++){
 35             int u=ch[0][i];
 36             if(u){
 37                 Q.push(u);
 38                 last[u]=f[u]=0;    
 39             }
 40         }
 41         while(!Q.empty()){
 42             int r=Q.front();Q.pop();
 43             for(int c=0;c<26;c++){
 44                 int u=ch[r][c];
 45                 if(!u) continue;
 46                 Q.push(u);
 47                 int v=f[r];
 48                 while(v&&!ch[v][c]) v=f[v];
 49                 f[u]=ch[v][c];
 50                 last[u]=val[f[u]]?f[u]:last[f[u]];
 51                     
 52             }
 53         }
 54     }
 55     void init()
 56     {
 57         ans=count=size=0;
 58         memset(val,0,sizeof(val));
 59         memset(book,0,sizeof(book));
 60         memset(ch[0],0,sizeof(ch[0]));
 61     }
 62     void insert(char *p)
 63     {
 64         int u=0;
 65         int n=strlen(p);
 66         for(int i=0;i<n;i++){
 67             int c=idx(p[i]);
 68             if(!ch[u][c]){
 69                 ch[u][c]=++size;
 70                 memset(ch[size],0,sizeof(ch[size]));
 71             }u=ch[u][c];
 72         }
 73         val[u]=++count;
 74     }
 75     void find(char *p)
 76     {
 77         int n=strlen(p),j=0;
 78         for(int i=0;i<n;i++)
 79         {
 80             int c=idx(p[i]);
 81             while(j&&!ch[j][c]) j=f[j];
 82             j=ch[j][c];
 83             if(val[j]){
 84                 if(!book[val[j]]){
 85                     ans++;
 86                     book[val[j]]=1;
 87                     printf("find:val[j]=%d\n",val[j]);
 88                 }
 89                 mark(last[j]);
 90             }else if(last[j]) mark(last[j]);
 91         }
 92     }
 93 };
 94 AC solver;
 95 int main()
 96 {
 97     solver.init();
 98     int n;
 99     char s[maxm];
100     scanf("%d",&n);
101     while(n--){
102         scanf("%s",s);
103         solver.insert(s);
104     }
105     solver.getF();
106     scanf("%s",s);
107     solver.find(s);
108     printf("%d",solver.ans);
109     return 0;
110 }

 

AC自动机

标签:

原文地址:http://www.cnblogs.com/gzhonghui/p/5803314.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!