标签:
http://acm.hdu.edu.cn/showproblem.php?pid=2222
求目标串出现了几个模式串.
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <vector> 5 #include <cstring> 6 #include <algorithm> 7 #include <string> 8 #include <set> 9 #include <functional> 10 #include <numeric> 11 #include <sstream> 12 #include <stack> 13 #include <map> 14 #include <queue> 15 16 #define CL(arr, val) memset(arr, val, sizeof(arr)) 17 18 #define ll long long 19 #define inf 0x7f7f7f7f 20 #define lc l,m,rt<<1 21 #define rc m + 1,r,rt<<1|1 22 #define pi acos(-1.0) 23 24 #define L(x) (x) << 1 25 #define R(x) (x) << 1 | 1 26 #define MID(l, r) (l + r) >> 1 27 #define Min(x, y) (x) < (y) ? (x) : (y) 28 #define Max(x, y) (x) < (y) ? (y) : (x) 29 #define E(x) (1 << (x)) 30 #define iabs(x) (x) < 0 ? -(x) : (x) 31 #define OUT(x) printf("%I64d\n", x) 32 #define lowbit(x) (x)&(-x) 33 #define Read() freopen("din.txt", "r", stdin) 34 #define Write() freopen("dout.txt", "w", stdout); 35 36 37 #define Nn 510007 38 #define Mc 26 39 40 using namespace std; 41 42 class Acautomaton 43 { 44 private: 45 46 int chd[Nn][Mc]; 47 int fail[Nn]; 48 int ID[Mc]; 49 int val[Nn]; 50 int Q[Nn]; 51 int sz; 52 53 public: 54 55 void Init() 56 { 57 fail[0] = 0; 58 for (int i = 0; i < Mc; ++i) 59 { 60 ID[i] = i; 61 } 62 } 63 void Reset() 64 { 65 CL(chd[0],0); 66 sz = 1; 67 } 68 void insert(char *s,int key) 69 { 70 int p = 0; 71 for (; *s; s++) 72 { 73 int k = ID[*s - ‘a‘]; 74 if (!chd[p][k]) 75 { 76 CL(chd[sz],0); 77 val[sz] = 0; 78 chd[p][k] = sz++; 79 } 80 p = chd[p][k]; 81 } 82 val[p] += key; 83 } 84 void Build() 85 { 86 int *s = Q ,*e = Q,i; 87 for (i = 0; i < Mc; ++i) 88 { 89 if (chd[0][i]) 90 { 91 *e++ = chd[0][i]; 92 fail[chd[0][i]] = 0; 93 } 94 } 95 while (s != e) 96 { 97 int u = *s++; 98 for (i = 0; i < Mc; ++i) 99 { 100 int &v = chd[u][i]; 101 if (v) 102 { 103 *e++ = v; 104 fail[v] = chd[fail[u]][i]; 105 } 106 else v = chd[fail[u]][i]; 107 } 108 } 109 } 110 int solve(char *s) 111 { 112 int p = 0; 113 int k,ans = 0; 114 for (; *s; s++) 115 { 116 k = ID[*s - ‘a‘]; 117 while (!chd[p][k] && p != 0) p = fail[p]; 118 119 p = chd[p][k]; 120 121 int rt = p; 122 while (rt != 0 && val[rt] != -1) 123 { 124 ans += val[rt]; 125 val[rt] = -1; 126 rt = fail[rt]; 127 } 128 } 129 return ans; 130 } 131 }ac; 132 133 char str[57],tr[1000007]; 134 int n; 135 136 int main() 137 { 138 int T; 139 int i; 140 scanf("%d",&T); 141 while (T--) 142 { 143 ac.Reset(); ac.Init(); 144 scanf("%d",&n); 145 for (i = 0; i < n; ++i) 146 { 147 scanf("%s",str); 148 ac.insert(str,1); 149 } 150 ac.Build(); 151 scanf("%s",tr); 152 printf("%d\n",ac.solve(tr)); 153 } 154 return 0; 155 }
hdu -2222 Keywords Search(AC自动机模板)
标签:
原文地址:http://www.cnblogs.com/nowandforever/p/4605549.html