您的位置:首页 > 其它

AC自动机 HDOJ 5384 Danganronpa

2015-08-17 20:53 302 查看
题目传送门

 /*
题意:多个文本串,多个模式串在每个文本串出现的次数
AC自动机:这就是一道模板题,杭电有道类似的题目
*/
/************************************************
* Author        :Running_Time
* Created Time  :2015-8-14 14:14:32
* File Name     :AC.cpp
************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int MAXN = 1e5 + 10;
const int MAXNODE = 6e5 + 10;
const int INF = 0x3f3f3f3f;
const int SIGMA_SIZE = 26;
const int MOD = 1e9 + 7;
ll res;
struct AC   {
int ch[MAXNODE][SIGMA_SIZE], f[MAXNODE], sz;
ll val[MAXNODE];
void init(void)   {
memset (ch[0], 0, sizeof (ch[0]));
sz = 1; val[0] = 0;
}
int idx(char c) {
return c - 'a';
}
void insert(string s) {
int u = 0;  int len = s.size ();
for (int i=0; i<len; ++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 build(void)    {
queue<int> Q;   f[0] = 0;
for (int i=0; i<SIGMA_SIZE; ++i)    {
int u = ch[0][i];
if (u)  {
f[u] = 0;   Q.push (u);
}
}
while (!Q.empty ()) {
int r = Q.front (); Q.pop ();
for (int i=0; i<SIGMA_SIZE; ++i)  {
int u = ch[r][i];
if (!u) {
ch[r][i] = ch[f[r]][i];    continue;
}
Q.push (u);
f[u] = ch[f[r]][i];
val[u] += val[f[u]];
}
}
}
ll query(string s)  {
int len = s.size ();
ll ret = 0; int j = 0;
for (int i=0; i<len; ++i)   {
int c = idx (s[i]);
j = ch[j][c];
ret += val[j];
}
return ret;
}
}ac;
string t[MAXN], p;

int main(void)    {     //HDOJ 5384 Danganronpa
int T;  scanf ("%d", &T);
while (T--) {
int n, m;   scanf ("%d%d", &n, &m);
ac.init ();
for (int i=1; i<=n; ++i)    cin >> t[i];
for (int i=1; i<=m; ++i)    {
cin >> p;    ac.insert (p);
}
ac.build ();
for (int i=1; i<=n; ++i)    {
printf ("%I64d\n", ac.query (t[i]));
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: