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

ac自动机膜板

时间:2018-06-17 21:23:51      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:color   onclick   return   uil   src   closed   turn   eve   技术   

技术分享图片
  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long LL;
  4 typedef unsigned long long ULL;
  5 #define MAXN 26
  6 #define L 31
  7 #define INF 1000000009
  8 #define eps 0.00000001
  9 struct node
 10 {
 11     node()
 12     {
 13         cnt = 0;
 14         fail = NULL;
 15         for (int i = 0; i < MAXN; i++)
 16             next[i] = NULL;
 17     }
 18     int cnt;
 19     struct node* next[MAXN];
 20     struct node* fail;
 21 };
 22 typedef struct node* Tree;
 23 void insert(Tree T, const char* str)
 24 {
 25     int p = 0;
 26     Tree tmp = T;
 27     while (str[p] != \0)
 28     {
 29         int k = str[p] - a;
 30         if (tmp->next[k] == NULL)
 31         {
 32             tmp->next[k] = new node();
 33         }
 34         tmp = tmp->next[k];
 35         p++;
 36     }
 37     tmp->cnt++;
 38 }
 39 void build_ac(Tree root)
 40 {
 41     root->fail = NULL;
 42     queue<Tree> q;
 43     q.push(root);
 44     while (!q.empty())
 45     {
 46         Tree tmp = q.front();
 47         q.pop();
 48         Tree p = NULL;
 49         for (int i = 0; i < MAXN; i++)
 50         {
 51             if (tmp->next[i] != NULL)
 52             {
 53                 if (tmp == root)
 54                     tmp->next[i]->fail = root;
 55                 else
 56                 {
 57                     p = tmp->fail;
 58                     while (p != NULL)
 59                     {
 60                         if (p->next[i] != NULL)
 61                         {
 62                             tmp->next[i]->fail = p->next[i];
 63                             break;
 64                         }
 65                         p = p->fail;
 66                     }
 67                     if (p == NULL) tmp->next[i]->fail = root;
 68                 }
 69                 q.push(tmp->next[i]);
 70             }
 71         }
 72     }
 73 }
 74 int query(Tree root,const char* str)
 75 {
 76     int i = 0;
 77     int count = 0;
 78     int l = strlen(str);
 79     Tree tmp = root;
 80     int index;
 81     while (str[i])
 82     {
 83         index = str[i] - a;
 84         while (tmp->next[index] == NULL && tmp != root)
 85             tmp = tmp->fail;
 86         tmp = tmp->next[index];
 87         if (tmp == NULL) tmp = root;
 88         Tree p = tmp;
 89         while (p != root)
 90         {
 91             count += p->cnt;
 92             p->cnt = 0;
 93             p = p->fail;
 94         }
 95         i++;
 96     }
 97     return count;
 98 }
 99  
100 void del(Tree root)
101 {
102     for (int i = 0; i < MAXN; i++)
103         if (root->next[i] != NULL)
104             del(root->next[i]);
105     delete root;
106 }
107 char key[60], s[1000010];
108 int main()
109 {
110     int T=1,n;
111     while (T--)
112     {
113         scanf("%d", &n);
114         Tree root = new node();
115         root->cnt = 0;
116         root->fail = NULL;
117         for (int i = 0; i < MAXN; i++)
118             root->next[i] = NULL;
119         for (int i = 0; i < n; i++)
120         {
121             scanf("%s", key);
122             insert(root, key);
123         }
124         build_ac(root);
125         scanf("%s", s);
126         printf("%d\n", query(root, s));
127         del(root);
128     }
129 }
ac

 

ac自动机膜板

标签:color   onclick   return   uil   src   closed   turn   eve   技术   

原文地址:https://www.cnblogs.com/mzh2017/p/9193679.html

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