LA4670 Dominating Patterns AC自动机模板

Posted 嘒彼小星

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LA4670 Dominating Patterns AC自动机模板相关的知识,希望对你有一定的参考价值。

Dominating Patterns

 

每次看着别人的代码改成自己的模板都很头大。。。空间少了个0卡了好久

裸题,用比map + string更高效的vector代替蓝书中的处理方法

技术分享图片
  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 #include <algorithm>
  6 #include <queue>
  7 #include <vector>
  8 #include <cmath> 
  9 #define min(a, b) ((a) < (b) ? (a) : (b))
 10 #define max(a, b) ((a) > (b) ? (a) : (b))
 11 #define abs(a) ((a) < 0 ? (-1 * (a)) : (a))
 12 inline void swap(int &a, int &b)
 13 {
 14     long long tmp = a;a = b;b = tmp;
 15 }
 16 inline void read(int &x)
 17 {
 18     x = 0;char ch = getchar(), c = ch;
 19     while(ch < 0 || ch > 9) c = ch, ch = getchar();
 20     while(ch <= 9 && ch >= 0) x = x * 10 + ch - 0, ch = getchar();
 21     if(c == -) x = -x;
 22 }
 23 
 24 const int INF = 0x3f3f3f3f;
 25 const int MAXNODE = 150 * 70 * 10;
 26 
 27 int ch[MAXNODE][30], last[MAXNODE], root = 0, tag[MAXNODE], fail[MAXNODE], cnt, tot[MAXNODE];
 28 std::vector<int> node[MAXNODE];
 29 char s[1600][800];
 30 
 31 void insert(int x)
 32 {
 33     int now = root;
 34     for(int i = 1;s[x][i] != \0;++ i)
 35     {
 36         int& tmp = ch[now][s[x][i] - a + 1];
 37         if(tmp) now = tmp;
 38         else now = tmp = ++ cnt; 
 39     }
 40     ++ tag[now];
 41     node[now].push_back(x);
 42 }
 43 
 44 int q[MAXNODE], he, ta, ma;
 45 void build()
 46 {
 47     he = 0, ta = 0;
 48     
 49     for(register int i = 1;i <= 26;++ i)
 50     {
 51         int u = ch[root][i];
 52         if(u) q[ta ++] = u, fail[u] = last[u] = 0;
 53     } 
 54     
 55     while(he < ta)
 56     {
 57         int now = q[he ++];
 58         for(register int i = 1;i <= 26;++ i)
 59         {
 60             int u = ch[now][i];
 61             if(!u) 
 62             {
 63                 ch[now][i] = ch[fail[now]][i];
 64                 continue;
 65             }
 66             q[ta ++] = u;
 67             int v = fail[now];
 68             while(v && !ch[v][i]) v = fail[v];
 69             fail[u] = ch[v][i];
 70             last[u] = tag[fail[u]] ? fail[u] : last[fail[u]];
 71         }
 72     }
 73 }
 74 
 75 
 76 int n;
 77 char T[1100000];
 78 
 79 void find()
 80 {
 81     int n = strlen(T + 1);
 82     int j = root;
 83     for(register int i = 1;i <= n;++ i)
 84     {
 85         int c = T[i] - a + 1;
 86         j = ch[j][c];
 87         if(tag[j])    for(int k = 0;k < node[j].size();++ k) ++ tot[node[j][k]], ma = max(ma, tot[node[j][k]]);
 88         else if(last[j]) for(int k = 0;k < node[last[j]].size();++ k) ++ tot[node[last[j]][k]], ma = max(ma, tot[node[last[j]][k]]);
 89     }
 90 }
 91 
 92 int main()
 93 {
 94     while(scanf("%d", &n) != EOF && n)
 95     {
 96         ma = 0, memset(tot, 0, sizeof(tot)), memset(ch, 0, sizeof(ch)), memset(tag, 0, sizeof(tag));
 97         for(register int i = 1;i <= cnt;++ i) node[i].clear();
 98         cnt = 1;
 99         for(register int i = 1;i <= n;++ i)
100         {
101             scanf("%s", s[i] + 1);
102             insert(i);
103         }
104         build();
105         scanf("%s", T + 1);
106         find();
107         printf("%d\n", ma);
108         for(register int i = 1;i <= n;++ i)
109             if(tot[i] == ma) printf("%s\n", s[i] + 1);
110     }
111     return 0;
112 }
LA4670

 

以上是关于LA4670 Dominating Patterns AC自动机模板的主要内容,如果未能解决你的问题,请参考以下文章

LA 4670 Dominating Patterns (AC自动机)

LA_4670_Dominating_Patterns_(AC自动机+map)

UvaLive 4670 Dominating Patterns

UVALive 4670 Dominating Patterns

UVALive-4670 Dominating Patterns / 洛谷 3796 模板AC自动机

UVa Live 4670 Dominating Patterns - Aho-Corasick自动机