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自动机就是这样