标签:
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