参考http://blog.csdn.net/qq574857122/article/details/12355091
以及AC自动机分类中的几篇文章。
下面是我照着敲的hdu2222代码。
#include <iostream>
#include <cmath>
#include <algorithm>
#include <string>
#include <deque>
#include <cstring>
#include <cstdio>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <cstdlib>
#include <iomanip>
using namespace std;
#define rep(i, a, b) for( i = (a); i <= (b); i++)
#define reps(i, a, b) for( i = (a); i < (b); i++)
#define pb push_back
#define ps push
#define mp make_pair
#define CLR(x,t) memset(x,t,sizeof x)
#define LEN(X) strlen(X)
#define F first
#define S second
#define Debug(x) cout<<#x<<"="<<x<<endl;
const double euler_r = 0.57721566490153286060651209;
const double pi = 3.141592653589793238462643383279;
const int inf=~0U>>1;
const int MOD = int(1e9) + 7;
const double EPS=1e-6;
typedef long long LL;
int ANS;
#define N 1000010
#define maxnode 250010
#define sigma_size 26
struct Trie
{
int ch[maxnode][sigma_size];
int val[maxnode];
int last[maxnode];
int f[maxnode]; //fail pointer
int sz;
void init() {sz = 1;CLR(ch, 0);CLR(val, 0);CLR(last, 0);CLR(f, 0);}
int idx(char c) {return c - 'a';}
void print(int j)
{
if(j)
{
printf("%d: %d\n", j, val[j]);
print(last[j]);
}
}
void insert(char *s)
{
int u = 0, len = LEN(s);
for(int i = 0; i < len; i++)
{
int c = idx(s[i]);
if(!ch[u][c]) ch[u][c] = sz++;
u = ch[u][c];
}
val[u]++;
}
void getfail()
{
queue<int> q;
for(int i = 0; i < sigma_size; i++) if(ch[0][i]) q.push(ch[0][i]);
while(!q.empty())
{
int r = q.front();q.pop();
for(int c = 0; c < sigma_size; c++)
{
int u = ch[r][c];
if(!u) continue;
q.push(u);
int v = f[r];
while(v && ch[v][c] == 0) v = f[v];
f[u] = ch[v][c];
last[u] = val[f[u]] ? f[u] : last[f[u]];
}
}
}
void find(char *T)
{
int len = LEN(T), j = 0;
for(int i = 0; i < len ; i++)
{
int c = idx(T[i]);
while(j && ch[j][c] == 0) j = f[j];
j = ch[j][c];
int temp = j;
while(temp && val[temp])
{
ANS += val[temp];
val[temp] = 0;
temp = f[temp];
}
}
}
};
Trie AC;
char s1[N];
int main()
{
int T, n;
scanf("%d", &T);
while(T--)
{
scanf("%d",&n);
AC.init();
while(n--)
{
scanf("%s",s1);
AC.insert(s1);
}
AC.getfail();
scanf("%s", s1);
ANS = 0;
AC.find(s1);
printf("%d\n", ANS);
}
return 0;
}