1 5 6 orz sto kirigiri danganronpa ooooo o kyouko dangan ronpa ooooo ooooo
1 1 0 3 7
题意:给n个母串,给m个匹配串,求每个母串依次和匹配串匹配,能得到的数目和。
题解:AC自动机模板题
#include <stdio.h> #include <algorithm> #include <iostream> #include <string.h> #include <queue> using namespace std; struct Trie { int next[500010][26],fail[500010],end[500010]; int root,L; int newnode() { for(int i = 0; i < 26; i++) next[L][i] = -1; end[L++] = 0; return L-1; } void init() { L = 0; root = newnode(); } void insert(char buf[]) { int len = strlen(buf); int now = root; for(int i = 0; i < len; i++) { if(next[now][buf[i]-'a'] == -1) next[now][buf[i]-'a'] = newnode(); now = next[now][buf[i]-'a']; } end[now]++; } void build() { queue<int>Q; fail[root] = root; for(int i = 0; i < 26; i++) if(next[root][i] == -1) next[root][i] = root; else { fail[next[root][i]] = root; Q.push(next[root][i]); } while( !Q.empty() ) { int now = Q.front(); Q.pop(); for(int i = 0; i < 26; i++) if(next[now][i] == -1) next[now][i] = next[fail[now]][i]; else { fail[next[now][i]]=next[fail[now]][i]; Q.push(next[now][i]); } } } int query(char buf[]) { int len = strlen(buf); int now = root; int res = 0; for(int i = 0; i < len; i++) { now = next[now][buf[i]-'a']; int temp = now; while( temp != root ) { res += end[temp]; //end[temp] = 0; temp = fail[temp]; } } return res; } void debug() { for(int i = 0; i < L; i++) { printf("id = %3d,fail = %3d,end = %3d,chi = [",i,fail[i],end[i]); for(int j = 0; j < 26; j++) printf("%2d",next[i][j]); printf("]\n"); } } }; char buf[100010]; int m; char s[605015]; char c[10010]; Trie ac; int main() { // freopen("test.in","r",stdin); int T; int n; scanf("%d",&T); while( T-- ) { scanf("%d%d",&n,&m); ac.init(); memset(s,0,sizeof s); int len=0; for(int i=0; i<n; i++) { ///把所有的串接起来,用空格隔开 scanf("%s",c); int l=strlen(c); if(i!=0)s[len++]=' '; strcat(s,c); len+=l; } s[len]=' '; s[++len]=0; for(int i=0; i<m; i++) { scanf("%s",buf); ac.insert(buf); } ac.build(); int l=0; while(l<len) { int k=0; while(s[l]!=' ') {///找到当前单词 buf[k++]=s[l++]; } buf[k]=0; l++; printf("%d\n",ac.query(buf)); } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/acm_baihuzi/article/details/47674317