本文共 2463 字,大约阅读时间需要 8 分钟。
//// main.cpp// AC自动机//// Created by liuzhe on 16/11/16.// Copyright © 2016年 my_code. All rights reserved.//#include#include #include #include #include #include #include #include using namespace std;
//hdu 5384struct Trie{ int next[100010][26],fail[210*500],end[210*500]; 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(string buf) { int len = buf.size(); 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 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(string buf) { int len = buf.size(); int now = root; int ans = 0; for(int i = 0;i < len;i++) { now = next[now][buf[i]-'a']; int temp = now; while(temp != root) { if(end[temp] != root) ans+=end[temp]; temp = fail[temp]; } } return ans; }};string buf[10010];Trie ac;int main(){ //ios::sync_with_stdio(false); int n,m,T; cin>>T; while(T--) { cin>>n>>m; for(int i=0;i>buf[i]; ac.init(); for(int i=0;i >s; ac.insert(s); } ac.build(); for(int i=0;i
//根据kuangbin修改
转载地址:http://scali.baihongyu.com/