这是我第一次写博客. 它可能组织得不好. 请原谅我.
我将发布一些有关我目前正在刷的交流自动机的问题. 我不会发布模板问题. . 对于初学者,您可以看看
博客.
为模板问题添加其他代码
hdu2222关键字搜索
//AC自动机
#include
#include
#include
#include
using namespace std ;
const int maxn = 5555555 ;
class AC_auto
{
private :
int tot , fail[maxn] , val[maxn] , c[26][maxn] ;
queue Q ;
int new_node ()
{
int i ;
fail[tot] = val[tot] = 0 ;
for ( i = 0 ; i < 26 ; i ++ ) c[i][tot] = 0 ;
return tot ++ ;
}
public :
void init ()
{
tot = 0 ; new_node () ;
while ( !Q.empty () ) Q.pop () ;
}
void insert ( char *s )
{
int now = 0 ;
for ( ; *s ; s ++ )
{
int k = *s - 'a' ;
if ( !c[k][now] ) c[k][now] = new_node () ;
now = c[k][now] ;
}
val[now] ++ ;
}
void get_fail ()
{
int i , u = 0 , j , e ;
for ( i = 0 ; i < 26 ; i ++ ) if ( c[i][u] ) Q.push ( c[i][u] ) ;
while ( !Q.empty () )
{
u = Q.front () ;
Q.pop () ;
for ( i = 0 ; i < 26 ; i ++ )
{
if ( !c[i][u] )
{
c[i][u] = c[i][fail[u]] ;
continue ;
}
e = c[i][u] ;
j = fail[u] ;
fail[e] = c[i][j] ;
Q.push ( e ) ;
}
}
}
int work ( char *s )
{
int u = 0 , i , e , ret = 0 ;
for ( ; *s ; s ++ )
{
int k = *s - 'a' ;
u = c[k][u] ;
e = u ;
while ( e )
{
if ( val[e] )
{
ret += val[e] ;
val[e] = 0 ;
}
e = fail[e] ;
}
}
return ret ;
}
} ac ;
char s[maxn] ;
int main ()
{
int cas , n ;
scanf ( "%d" , &cas ) ;
while ( cas -- )
{
scanf ( "%d" , &n ) ;
ac.init () ;
while ( n -- )
{
scanf ( "%s" , s ) ;
ac.insert ( s ) ;
}
ac.get_fail () ;
scanf ( "%s" , s ) ;
printf ( "%d\n" , ac.work ( s ) ) ;
}
}
交流自动机模板的另一个Java版本
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-208177-1.html