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
原文:http://blog.csdn.net/guard_mine/article/details/43494477