#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=6e5+6;
string aa[N];
string tmp;
struct AC
{
int tr[N][26],fail[N],e[N],cnt,root;
ll newnode()
{
for(ll i=0;i<26;i++)tr[cnt][i]=0;
e[cnt++]=0;
return cnt-1;
}
void init()
{
memset(tr,0,sizeof(tr));
memset(fail,0,sizeof(fail));
memset(e,0,sizeof(e));
cnt=0;
root=newnode();
}
void insert(string s)
{
ll p=0;
for(ll i=0;i<s.size();i++)
{
ll n=s[i]-'a';
if(tr[p][n]==0)tr[p][n]=newnode();
p=tr[p][n];
}
e[p]++;
}
void getfail()
{
queue<ll> q;
for(ll i=0;i<26;i++)
if(tr[0][i])q.push(tr[0][i]);
while(!q.empty())
{
ll u=q.front();
q.pop();
for(ll 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];
}
}
}
ll match(string t)
{
ll sum=0,u=root;
for(ll i=0;i<t.size();i++)
{
ll n=t[i]-'a';
u=tr[u][n];
for(ll j=u;j;j=fail[j])sum+=e[j];
}
return sum;
}
}ac;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
ll t;
cin>>t;
for(ll j=1;j<=t;j++)
{
ac.init();
ll n,m;
cin>>n>>m;
for(ll i=1;i<=n;i++)cin>>aa[i];
for(ll i=1;i<=m;i++)
{
cin>>tmp;
ac.insert(tmp);
}
ac.getfail();
for(ll i=1;i<=n;i++)cout<<ac.match(aa[i])<<endl;
}
return 0;
}
HDU 5384 Danganronpa
猜你喜欢
转载自blog.csdn.net/Ambrumf/article/details/120657458
今日推荐
周排行