标签:
1 5 6 orz sto kirigiri danganronpa ooooo o kyouko dangan ronpa ooooo ooooo
1 1 0 3 7
#include <bits/stdc++.h>
using namespace std;
#define prt(k) cerr<<#k" = "<<k<<edl
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int M=6e5+7, N=1e5+8;
int ch[M][26], ed[M];
int pos[N];
int L, root = 0;
int fail[M];
char str[M], buf[M];
int newnode()
{
memset(ch[L], -1, sizeof ch[L]);
ed[L++] = 0;
return L - 1;
}
void AC_init() { L = 0; newnode(); }
void insert(char s[])
{
int n = strlen(s);
int u = 0;
for (int i=0;i<n;i++) {
int &v = ch[u][s[i] - 'a'];
if (v == -1)
v = newnode();
u = v;
}
ed[u] ++;
}
void AC_build()
{
queue<int> q;
for (int i=0;i<26;i++) {
int &v = ch[0][i];
if (v != -1) {
q.push(v);
fail[v] = 0;
} else v = 0;
}
while (!q.empty()) {
int u = q.front(); q.pop();
for (int i=0;i<26;i++) {
int &v = ch[u][i];
if (v==-1) {
v = ch[fail[u]][i];
} else {
fail[v] = ch[fail[u]][i];
q.push(v);
}
}
}
}
ll query(char buf[], int len)
{
ll ret = 0; int u = 0;
for (int i=0;i<len;i++) {
u = ch[u][buf[i] - 'a'];
for (int v=u; v>0; v=fail[v])
ret += ed[v];
}
return ret;
}
int n, m;
int main()
{
int re, ca= 1; scanf("%d", &re);
while (re--) {
scanf("%d%d", &n, &m);
pos[0] = 0;
for (int i=0;i<n;i++) {
scanf("%s", str + pos[i]);
pos[i+1 ] = strlen(str);
}
AC_init();
for (int i=0;i<m;i++) {
scanf("%s", buf);
insert(buf);
}
AC_build();
for (int i=0;i<n;i++) {
ll ans = 0;
ans = query(str + pos[i], pos[i+1] - pos[i]);
printf("%I64d\n", ans);
}
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/oilover/article/details/47622913