模板,没太理解到呢。
Flag :明天再打一遍。
#include<bits/stdc++.h>
using namespace std;
#define N 1000005
int n;
namespace AC
{
int tr[N][26], tot;
int e[N], fail[N];
void insert(char *s)
{
int u = 0;
for(int i = 1; s[i]; i++)
{
if(!tr[u][s[i] - 'a'])
{
tr[u][s[i] - 'a'] = ++tot;
}
u = tr[u][s[i] - 'a'];
}
e[u]++;
return;
}
queue<int> q;
void build()
{
for(int i = 0; i < 26; i++)
{
if(tr[0][i])
{
q.push(tr[0][i]);
}
}
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = 0; i < 26; i++)
{
if(tr[u][i])
{
fail[tr[u][i]] = tr[fail[u]][i];
q.push(tr[u][i]);
}
else
{
tr[u][i] = tr[fail[u]][i];
}
}
}
return;
}
int query(char *s)
{
int u = 0, ret = 0;
for(int i = 1; s[i]; i++)
{
u = tr[u][s[i] - 'a'];
for(int j = u; j && e[j] != -1; j = fail[j])
{
ret += e[j];
e[j] = -1;
}
}
return ret;
}
}
char s[N];
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
scanf("%s", s + 1);
AC::insert(s);
}
scanf("%s", s + 1);
AC::build();
printf("%d", AC::query(s));
return 0;
}