hdu2222-AC自动机&模板-Keywords Search
2017-09-02 12:27
309 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2222
ac自动机的 失配指针不同于 kmp,不是递归算,是用广搜算的。
对很多模式串的处理,是基于字典树。
以后的问题,做题中慢慢遇到吧。
ac自动机的 失配指针不同于 kmp,不是递归算,是用广搜算的。
对很多模式串的处理,是基于字典树。
以后的问题,做题中慢慢遇到吧。
#include <bits/stdc++.h> 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"); } } }; Trie ac; char s[1000006]; int main() { int t,m; scanf("%d",&t); while(t--){ ac.init();//初始化 scanf("%d",&m); getchar(); for(int i=0;i<m;i++){ scanf("%s",s); ac.insert(s);//插入 } ac.build();//广搜 构造失配指针。 scanf("%s",s); printf("%d\n",ac.query(s)); } return 0; }
相关文章推荐
- Keywords Search---hdu2222(AC自动机 模板)
- [AC自动机(模板题)] hdu2222 Keywords Search
- AC自动机 模板 【HDU2222】 Keywords Search
- 【HDU2222】【AC自动机模板 测烂为止】Keywords Search
- hdu2222 Keywords Search
- HDU2222 Keywords Search
- HDU2222 Keywords Search(AC自动机模板)
- HDOJ 2222.Keywords Search(AC自动机模板)
- HDU2222 Keywords Search
- ac自动机基础模板(hdu2222)
- AC自动机 ( 动态建树模板 )——Keywords Search ( HDU 2222 )
- [AC自动机]hdu2222 Keywords Search
- HDU2222【AC自动机(基础·模板)】
- 【HDU2222】Keywords Search
- hdu2222 Keywords Search
- HDU 2222 Keywords Search(我的第一道AC自动机,模板题)
- 【hdu2222】Keywords Search
- AC自动机(1)--hdu2222(基本模板)
- 【hdu2222】Keywords Search
- 【AC自动机】[HDU2222]Keywords Search