标签:
lcy
题意:看现在的主字符串,有多少个零碎的字符串构成, 做法:AC自动机模板 代码如下: #include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> #include<cmath> #include<queue> #define maxn 500010 using namespace std; struct Tire { int next[maxn][26],fail[maxn],end[maxn]; 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 tmp = now; while(tmp != root) { res += end[tmp]; end[tmp] = 0; tmp = fail[tmp]; } } return res; } }; char buf[1000010]; Tire ac; int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif // ONLINE_JUDGE int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); ac.init(); for(int i=0;i<n;i++) { scanf("%s",buf); ac.insert(buf); } ac.build(); scanf("%s",buf); printf("%d\n",ac.query(buf)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/chenyang920/p/4355369.html