AC自动机模板题。。因为没有理解昀神的思想,花了好久。。。
#include <iostream>
#include <sstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <climits>
#define maxn 2000005
#define eps 1e-6
#define mod 10007
#define INF 99999999
#define lowbit(x) (x&(-x))
//#define lson o<<1, L, mid
//#define rson o<<1 | 1, mid+1, R
typedef long long LL;
using namespace std;
int next[maxn][26];
int fail[maxn];
int end[maxn];
queue<int> q;
char str[1005][60];
char t[maxn];
int cnt[maxn];
int top;
int root, tmp, now;
int n;
int newnode(void)
{
fail[top] = end[top] = -1;
for(int i = 0; i < 26; i++)
next[top][i] = -1;
return top++;
}
void init(void)
{
top = 0;
memset(cnt, 0, sizeof cnt);
root = newnode();
}
void insert(char *s, int x)
{
int len = strlen(s), i, k;
now = root;
for(i = 0; i < len; i++) {
k = s[i] - 'A';
if(next[now][k] == -1) next[now][k] = newnode();
now = next[now][k];
}
end[now] = x;
}
void build(void)
{
int i;
fail[root] = root;
for(i = 0; i < 26; i++) {
if(~next[root][i]) {
fail[next[root][i]] = root;
q.push(next[root][i]);
}
else next[root][i] = root;
}
while(!q.empty()) {
now = q.front();
q.pop();
for(i = 0; i < 26; i++) {
if(~next[now][i]) {
fail[next[now][i]] = next[fail[now]][i];
q.push(next[now][i]);
}
else next[now][i] = next[fail[now]][i];
}
}
}
void read(void)
{
for(int i = 1; i <= n; i++) {
scanf("%s", str[i]);
insert(str[i], i);
}
scanf("%s", t);
}
void query(void)
{
int len = strlen(t), i;
now = root;
for(i = 0; i < len; i++) {
if(t[i] < 'A' || t[i] > 'Z'){
now = root;
continue;
}
now = next[now][t[i] - 'A'];
tmp = now;
while(tmp != root) {
if(~end[tmp]) cnt[end[tmp]]++;
tmp = fail[tmp];
}
}
}
void work(void)
{
for(int i = 1; i <= n; i++)
if(cnt[i])
printf("%s: %d\n", str[i], cnt[i]);
}
int main(void)
{
while(scanf("%d", &n)!=EOF) {
init();
read();
build();
query();
work();
}
return 0;
}