标签:show tput ac自动机 should auth 自动机 class pop user
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 67122 Accepted Submission(s): 22584
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> #include <vector> #include <iomanip> #include <math.h> #include <map> using namespace std; #define FIN freopen("input.txt","r",stdin); #define FOUT freopen("output.txt","w",stdout); #define INFLL 0x3f3f3f3f3f3f3f #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef long long LL; typedef pair<double, double> PII; 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"); } } }; Trie AC; char s[1000005]; int main() { //FIN int T; scanf("%d", &T); while(T--) { AC.init(); int n; scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%s", s); AC.insert(s); } AC.build(); scanf("%s", s); printf("%d\n", AC.query(s)); } return 0; }
HDU 2222 Keywords Search AC自动机
标签:show tput ac自动机 should auth 自动机 class pop user
原文地址:http://www.cnblogs.com/Hyouka/p/7450827.html