第一道AC 自动机的题目。。代码参考了网上大牛才写的。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#pragma warning (disable :4996)
using namespace std;
const int Max = 500010;
int Next[Max][26], Fail[Max], End[Max];
int root, L;
int Newnode()
{
for (int i = 0; i < 26; i++)
Next[L][i] = -1;
End[L++] = 0;
return L - 1;
}
void Init()
{
L = 0;
root = Newnode();
}
void Insert(char buf[])
{
int len = strlen(buf);
int now = root;
for (int i = 0; i < len; i++)
{
if (Next[now][buf[i] - 'a'] == -1)
Next[now][buf[i] - 'a'] = Newnode();
now = Next[now][buf[i] - 'a'];
}
End[now]++;
}
void Build()
{
Fail[root] = root;
queue<int>Q;
for (int i = 0; i < 26; i++)
if (Next[root][i] == -1)
Next[root][i] = root;
else
{
Fail[Next[root][i]] = root;
Q.push(Next[root][i]);
}
while (!Q.empty())
{
int now = Q.front();
Q.pop();
for (int i = 0; i < 26; i++)
{
if (Next[now][i] == -1)
Next[now][i] = Next[Fail[now]][i];
else
{
Fail[Next[now][i]] = Next[Fail[now]][i];
Q.push(Next[now][i]);
}
}
}
}
int Query(char buf[])
{
int len = strlen(buf);
int res = 0;
int now = root;
for (int i = 0; i < len; i++)
{
now = Next[now][buf[i] - 'a'];
int temp = now;
while (temp != root)
{
res += End[temp];
End[temp] = 0;
temp = Fail[temp];
}
}
return res;
}
char s[1000010];
int main()
{
int T, n;
scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
Init();
while (n--)
{
scanf("%s", s);
Insert(s);
}
scanf("%s", s);
Build();
printf("%d\n", Query(s));
}
return 0;
}