好不容易敲好模板好吗,TM还有trick。。。。。查了好几遍代码!!!!!相同字符串按不同处理。。。。。果然这题够222222
#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
#define maxno 1000000
#define size 26
char s[1000009];
int ch[maxno][size];
int val[maxno];
int last[maxno];
int f[maxno];
int sz;
int ans;
map<int,int> m;
void clea()
{
memset(ch[0],0,sizeof(ch[0]));
sz=1;
}
int idx(char x){return x-'a';}
void insert(char *s)
{
int n=strlen(s);
int u=0;
for(int i=0;i<n;i++)
{
int c=idx(s[i]);
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]++;
}
void getfail()
{
queue<int> q;
f[0]=0;
for(int i=0;i<size;i++){
if(ch[0][i])
{
q.push(ch[0][i]);
f[ch[0][i]]=0;
last[ch[0][i]]=0;
}
}
while(!q.empty())
{
int r=q.front();
q.pop();
for(int i=0;i<size;i++)
{
int u=ch[r][i];
if(!u)
continue;
q.push(u);
f[u]=0;
last[u]=0;
int v=f[r];
while(v&&!ch[v][i])
v=f[v];
f[u]=ch[v][i];
if(val[f[u]])
last[u]=f[u];
else
last[u]=last[f[u]];
}
}
}
void print(int j)
{
if(!m[j]&&j)
{
ans+=val[j];
m[j]=1;
print(last[j]);
}
}
void find()
{
int n=strlen(s);
int j=0;
// int u=0;
for(int i=0;i<n;i++)
{
int c=idx(s[i]);
while(j&&!ch[j][c])
j=f[j];
j=ch[j][c];
if(val[j])
print(j);
else if(last[j])
print(last[j]);
}
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int t,n;
char s1[55];
scanf("%d",&t);
while(t--)
{ clea();
ans=0;
m.clear();
//memset(f,0,sizeof(f));
// memset(last,0,sizeof(last));
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",s1);
insert(s1);
}
scanf("%s",s);
getfail();
find();
printf("%d\n",ans);
}
return 0;
}