标签:des style blog color io os ar java strong
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 35655 Accepted Submission(s): 11496
Mean:
给你n个单词,再给你一篇文章,让你统计有多少个单词在文章中出现过。
analyse:
裸的AC自动机,模板题。
Time complexity:o(n)+o(ml) n个模式串长度均不超过m,文本串长度为L
Source code:
// Memory Time // 1347K 0MS // by : Snarl_jsb // 2014-09-29-20.14 #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<vector> #include<queue> #include<stack> #include<map> #include<string> #include<climits> #include<cmath> #define N 10010 #define LL long long using namespace std; namespace ac_auto { char str[1000005]; struct node { node *next[26]; node *fail; int count; node() { for(int i = 0; i < 26; i++) next[i] = NULL; count = 0; fail = NULL; } }*q[50*N]; node *root; int head, tail; void Insert(char *str) // 插入单词 { node *p = root; int i = 0, index; while(str[i]) { index = str[i] - ‘a‘; if(p->next[index] == NULL) p->next[index] = new node(); p = p->next[index]; i++; } p->count++; } void build_ac_automation(node *root) // bfs建立fail指针 { root->fail = NULL; q[tail++] = root; while(head < tail) { node *temp = q[head++]; node *p = NULL; for(int i = 0; i < 26; i++) { if(temp->next[i] != NULL) { if(temp == root) temp->next[i]->fail = root; else { p = temp->fail; while(p != NULL) { if(p->next[i] != NULL) { temp->next[i]->fail = p->next[i]; break; } p = p->fail; } if(p == NULL) temp->next[i]->fail = root; } q[tail++] = temp->next[i]; } } } } int Query(node *root) // 匹配 + 统计 { int i = 0, cnt = 0, index; node *p = root; while(str[i]) { index = str[i] - ‘a‘; while(p->next[index] == NULL && p != root) p = p->fail; p = p->next[index]; if(p == NULL) p = root; node *temp = p; while(temp != root && temp->count != -1) { cnt += temp->count; temp->count = -1; temp = temp->fail; } i++; } return cnt; } } using namespace ac_auto; int main() { int T, n; scanf("%d",&T); while(T--) { head = tail = 0; // 清零 root = new node(); // 申请新的root结点 scanf("%d",&n); while(n--) { scanf("%s", str); Insert(str); // 插入单词 } build_ac_automation(root); // 建树 scanf("%s",str); printf("%d\n", Query(root)); // 查找+统计 } return 0; }
AC自动机 - 多模式串匹配问题的基本运用 + 模板题 --- HDU 2222
标签:des style blog color io os ar java strong
原文地址:http://www.cnblogs.com/acmer-jsb/p/4000884.html