靠靠靠太煞笔了。。。
本来昨天晚上想得吃完饭回去就能写完,结果硬是调了一晚上加一早晨原因是有个地方应该每次访问都加一我写成了每次都赋值为1。。。。
喜闻乐见的模版题就不多说了。。。
靠竟然为了这个题没有看丹佛野马的nfl美联决赛。。。。
一会七点半的国联决赛也看不成了。。。
#include<iostream>
#include<queue>
#define MAX 1000005
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
struct trie
{
int ch[MAX][28];
int val[MAX];
int sz;
int fail[MAX];
trie()
{
sz=0;
memset(ch[0],0,sizeof(ch[0]));
memset(val,false,sizeof(val));
}
int num(char cj)
{
return(cj-'a'+1);
}
void insert(string s)
{
int len=s.length();
int u=0;
for(int i=0;i<len;i++)
{
int c=num(s[i]);
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
ch[u][c]=++sz;
u=sz;
}
else
u=ch[u][c];
}
val[u]++;
}
void clear()
{
sz=0;
memset(ch,0,sizeof(ch));
memset(val,0,sizeof(val));
memset(fail,0,sizeof(fail));
}
}wbysr;
void init()
{
string s1;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>s1;
wbysr.insert(s1);
}
return;
}
void make_fail()
{
wbysr.fail[0]=-1;
int x,y,t;
queue<int>q;
q.push(0);
while(!q.empty())
{
x=q.front();
q.pop();
for(int i=1;i<=26;i++)
if(wbysr.ch[x][i])
{
y=wbysr.ch[x][i];
q.push(y);
t=wbysr.fail[x];
while(t!=-1&&!wbysr.ch[t][i])
t=wbysr.fail[t];
if(t>=0)
wbysr.fail[y]=wbysr.ch[t][i];
else
wbysr.fail[y]=0;
}
}
}
void fuck_it()
{
string word;
cin>>word;
int len=word.length(),now=0,ans=0;
int j;
for(int i=0;i<len;i++)
{
j=word[i]-'a'+1;
while(now!=-1&&!wbysr.ch[now][j])
now=wbysr.fail[now];
if(now>=0)
now=wbysr.ch[now][j];
else
now=0;
for(int j=now;j!=-1;j=wbysr.fail[j])
{
ans+=wbysr.val[j];
wbysr.val[j]=0;
}
}
printf("%d\n",ans);
}
int main()
{
int time;
scanf("%d",&time);
while(time--)
{
wbysr.clear();
init();
make_fail();
fuck_it();
}
return 0;
}