标签:ac自动机
3 2 AB DCB DACB 3 ABC CDE GHI ABCCDEFIHG 4 ABB ACDEE BBB FEEE A[2B]CD[4E]F
0 3 2HintIn the second case in the sample input, the reverse of the program is ‘GHIFEDCCBA’, and ‘GHI’ is a substring of the reverse, so the program is infected by virus ‘GHI’.
AC自动机水题
/************************************************************************* > File Name: hdu3695.cpp > Author: ALex > Mail: zchao1995@gmail.com > Created Time: 2015年02月04日 星期三 21时17分18秒 ************************************************************************/ #include <map> #include <set> #include <queue> #include <stack> #include <vector> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const double pi = acos(-1); const int inf = 0x3f3f3f3f; const double eps = 1e-15; typedef long long LL; typedef pair <int, int> PLL; const int N = 5110000; char str[1010]; char buf[N]; char input[N]; struct node { node *next[26]; //根据题目而定 node *fail; int count; node () { fail = NULL; for (int i = 0; i < 26; ++i) { next[i] = NULL; } count = 0; } }; node *qu[500010]; class AC_Automation { private: node *root; int head; int tail; public: AC_Automation() { head = 0; tail = 0; root = new node(); } void Build_Trie(char str[]) { int len = strlen (str); node *p = root; for (int i = 0; i < len; ++i) { int ind = str[i] - 'A'; if (p -> next[ind] == NULL) { p -> next[ind] = new node(); } p = p -> next[ind]; } ++p -> count; } void Build_AC () { root -> fail = NULL; qu[tail++] = root; while (head < tail) { node *now = qu[head++]; node *p = NULL; for (int i = 0; i < 26; ++i) { if (now -> next[i] != NULL) { if (now == root) { now -> next[i] -> fail = root; } else { p = now -> fail; while (p != NULL) { if (p -> next[i] != NULL) { now -> next[i] -> fail = p -> next[i]; break; } else { p = p -> fail; } } } if (p == NULL) { now -> next[i] -> fail = root; } qu[tail++] = now -> next[i]; } } } } int Match (char buf[]) { int ans = 0; int len = strlen (buf); node *p = root; for (int i = 0; i < len; ++i) { int ind = buf[i] - 'A'; while (p -> next[ind] == NULL && p != root) { p = p -> fail; } p = p -> next[ind]; if (p == NULL) { p = root; } node *tmp = p; while (tmp != root && tmp -> count != -1) { ans += tmp -> count; tmp -> count = -1; tmp = tmp -> fail; } } return ans; } void dfs (node *p) { for (int i = 0; i < 26; ++i) { if (p -> next[i] != NULL) { dfs (p -> next[i]); } } delete p; } ~AC_Automation() { dfs (root); } }; int main () { int t; scanf("%d", &t); while (t--) { int n; scanf("%d", &n); AC_Automation AC; for (int i = 1; i <= n; ++i) { scanf("%s", str); AC.Build_Trie (str); } scanf("%s", input); int len = strlen (input); int cnt = 0; for (int i = 0; i < len; ++i) { if (input[i] >= 'A' && input[i] <= 'Z') { buf[cnt++] = input[i]; } else if (input[i] == '[') { int x = 0; ++i; while (input[i] >= '0' && input[i] <= '9' && i < len) { x = x * 10 + input[i++] - '0'; } for (int j = 0; j < x; ++j) { buf[cnt++] = input[i]; } ++i; } else if (input[i] == ']') { continue; } } buf[cnt] = '\0'; AC.Build_AC(); int ans = AC.Match(buf); for (int i = 0;i < cnt / 2; ++i) { swap (buf[i], buf[cnt - i - 1]); } ans += AC.Match(buf); printf("%d\n", ans); } return 0; }
HDU3695---Computer Virus on Planet Pandora
标签:ac自动机
原文地址:http://blog.csdn.net/guard_mine/article/details/43494477