HDU 2222 Keywords Search
2016-08-04 14:11
295 查看
AC自动机模板题233333
#include<queue> #include<cstdio> #include<cstring> using namespace std; char word[55], s[1000010]; struct node { node *next[26], *fail; int cnt; node() { cnt=0; fail=NULL; memset(next,NULL,sizeof(next)); } }; struct ACAutomaton { node* root; void init() { root=new node; root->fail=root; } void insert(char* s) { node* p=root; for(int i = 0; s[i]; i++) { int c=s[i]-'a'; if(p->next[c] == NULL) p->next[c] = new node; p=p->next[c]; } p->cnt++; } void build() { queue<node*> q; for(int i = 0; i < 26; i++) { if(root->next[i]) { q.push(root->next[i]); root->next[i]->fail=root; } } while(!q.empty()) { node* u = q.front(); q.pop(); for(int i = 0; i < 26; i++) { if(u->next[i]) { node* v=u->next[i]; q.push(v); node* t=u->fail; while(t!=root && t->next[i]==NULL) t=t->fail; v->fail=(t->next[i]?t->next[i]:root); } } } } int find(char* s) { node* cur=root; int ans=0; for(int i = 0; s[i]; i++) { int c=s[i]-'a'; while(cur!=root && cur->next[c]==NULL) cur=cur->fail; cur=(cur->next[c]?cur->next[c]:root); for(node* p=cur; p->cnt && p!=root; p=p->fail) { ans+=p->cnt; p->cnt=0; } } return ans; } }; int main() { int T; scanf("%d",&T); while(T--) { int n; ACAutomaton AC; scanf("%d",&n); AC.init(); for(int i = 1; i <= n; i++) { scanf("%s",word); AC.insert(word); } AC.build(); scanf("%s",s); printf("%d\n",AC.find(s)); } return 0; }
相关文章推荐
- hdu 2222 keywords search
- HDU 2222 Keywords Search (AC自动机)
- Hdu 2222 . Keywords Search
- HDU 2222 Keywords Search
- 【HDU 2222】Keywords Search
- hdu 2222 Keywords Search (AC自动机)
- HDU 2222 Keywords Search
- HDU 2222 Keywords Search
- HDU - 2222 Keywords Search
- hdu 2222(Keywords Search) (AC自动机)
- hdu2222——Keywords Search
- HDU-2222 Keywords Search (AC自动机入门)
- HDU-2222 Keywords Search
- HDU 2222 Keywords Search
- HDU 2222 Keywords Search
- HDU2222-Keywords Search
- 【HDU】2222 Keywords Search
- HDU 2222 Keywords Search
- HDU 2222 Keywords Search
- HDU 2222 Keywords Search