ac自动机 java 详解_AC自动机模板(C ++版和Java版)

2a885202993f92b15588a98e529c788d.png

这是我第一次写博客. 它可能组织得不好. 请原谅我.

b9751edf8eb551d849ea8d87d464901f1.jpg

我将发布一些有关我目前正在刷的交流自动机的问题. 我不会发布模板问题. . 对于初学者,您可以看看

20180129170146929493.png

博客.

8d67781027589bdc1d39b4ddaaf132c3.png

为模板问题添加其他代码

GEIxc6.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值