标签:
Description
Input
Output
Sample Input
1 5 she he say shr her yasherhs
Sample Output
3
入门的问题,给出n个字符串,问结果字符串可以匹配到几个给出的字符串。
自动机的模板题,留作模板了
#include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std ; struct node{ int flag ; node *next[26] , *fail ; }; queue <node*> que ; char str[1100000] , s[100] ; node *newnode() { node *p ; p = new node ; p->flag = 0 ; p->fail = NULL ; for(int i = 0 ; i < 26 ; i++) p->next[i] = NULL ; return p ; } void settree(char *s,node *p) { int i , k , l = strlen(s) ; for(i = 0 ; i < l ; i++) { k = s[i] - 'a' ; if( p->next[k] == NULL ) p->next[k] = newnode() ; p = p->next[k] ; } p->flag++ ; return ; } void setfail(node *rt) { int i ; node *p , *q ; while( !que.empty() ) que.pop() ; que.push(rt) ; while( !que.empty() ) { p = que.front() ; que.pop() ; for(i = 0 ; i < 26 ; i++) { if( p->next[i] ) { q = p->fail ; while( q && !q->next[i] ) q = q->fail ; p->next[i]->fail = q == NULL ? rt : q->next[i] ; que.push(p->next[i]) ; } else p->next[i] = p == rt ? rt : p->fail->next[i] ; } } } int query(char *str,node *rt) { int num = 0 , i , k , l = strlen(str) ; node *p = rt , *temp ; for(i = 0 ; i < l ; i++) { k = str[i] - 'a' ; p = p->next[k] ; temp = p ; while( temp && temp->flag ) { num += temp->flag ; temp->flag = 0 ; temp = temp->fail ; } } return num ; } int main() { int t , n , i ; node *rt ; scanf("%d", &t) ; while( t-- ) { rt = newnode() ; scanf("%d", &n) ; while( n-- ) { scanf("%s", s) ; settree(s,rt) ; } setfail(rt) ; scanf("%s", str) ; printf("%d\n", query(str,rt)) ; } return 0; }
hdu2222-- Keywords Search(AC自动机入门)
标签:
原文地址:http://blog.csdn.net/winddreams/article/details/43408207