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

AC自动机专题

时间:2015-08-17 23:12:02      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

AC自动机

 

 

 1 /*
 2   AC自动机模板
 3 */
 4 struct AC   {
 5     int ch[MAXNODE][SIZE], fail[MAXNODE], val[MAXNODE], sz;
 6     void init(void) {
 7         memset (ch[0], 0, sizeof (ch[0]));
 8         sz = 1; val[0] = 0;
 9     }
10     int idx(char c) {
11         return c - a;
12     }
13     void insert(char *P)    {
14         int u = 0;
15         for (int i=0; P[i]; ++i)   {
16             int c = idx (P[i]);
17             if (!ch[u][c])  {
18                 memset (ch[sz], 0, sizeof (ch[sz]));
19                 ch[u][c] = sz;  val[sz++] = 0;
20             }
21             u = ch[u][c];
22         }
23         val[u]++;
24     }
25     void get_fail(void) {
26         queue<int> Q;   fail[0] = 0;
27         for (int i=0; i<SIZE; ++i)  {
28             int u = ch[0][i];
29             if (u)  {
30                 fail[u] = 0;    Q.push (u);
31             }
32         }
33         while (!Q.empty ()) {
34             int u = Q.front (); Q.pop ();
35             for (int i=0; i<SIZE; ++i)  {
36                 int &v = ch[u][i];
37                 if (!v) {
38                     v = ch[fail[u]][i];  continue;
39                 }
40                 Q.push (v);
41                 fail[v] = ch[fail[u]][i];   //val[v] += val[fail[u]];
42             }
43         }
44     }
45     int query(char *T)  {
46         int ret = 0;
47         for (int u=0, i=0; T[i]; ++i)   {
48             int c = idx (T[i]);
49             u = ch[u][c];
50             ret += val[u];
51             int tmp = u;
52             while (tmp) {
53                 ret += val[tmp];    val[tmp] = 0;
54                 tmp = fail[tmp];
55             }
56         }
57         return ret;
58     }
59 }ac;

 

AC自动机专题

标签:

原文地址:http://www.cnblogs.com/Running-Time/p/4737746.html

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