AC算法---原理和Trie图基本一样

AC算法涉及到三个表:goto表,fail表,output表


goto表的构造output表也是伴随goto表一块构造的:(类似于Trie树的构造)

下面举例说明:

输入串:feng   fe    tao    ao

对于第一个字符串feng:


output表:4    feng

对于第二个字符串fe:


output表:2    fe

                 4    feng

对于第三个字符串tao:


output表: 2    fe

                 4    feng

                  7    tao

对于第四个字符串ao:


output表: 2    fe

                 4    feng

                 7    tao

                  9    ao


最后对于起始串自己向自己跳转。


fail表的构造此时也存在output表的更新:(类似于Trie图中找后缀结点)


设结点为i对应的跳转值为f(i),对于goto表中走不动的结点需要求解f(i):

f(i)的求解需要知道f(i-1)并且需要记录结点i的入边上的字符设为'x'那么f(i)就是结点f(i-1)出边上的字符为'x'所指向的结点,如果f(i-1)没有这么一条边那么就找f(i-1)的f(i-1)直到0结点也找不到这么一条边那么f(i)就等于0。这一套方法和Trie图的求解后缀结点是一样一样的。

fail表:

  i      1     2      3     4     5     6    7     8        9

f(i)     0     0      0     0     0     8    9     0        0

同时对output表的更新:如果f(i)是个输出结点那么i的output也要加入f(i)输出的内容,

例如:f(7)=9输出 ao

那么output表就变为了:

output表: 2    fe

                 4    feng

                 7    tao  ao

                  9    ao

这样三个表就建完了,AC自动机就是这样



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值