摘要:
好久没写AC自动机了,学了SAM以后发现对AC自动机的理解也加深了,其实它们的精髓都是用后缀的前缀来处理字串(后缀数组也是)。 那么这个题光会写AC自动机可不行,还要会处理询问。这个题询问第x个串在第y个串中出现的次数,于是我们可以想到把所有串建AC自动机,然后利用fail指针的性质:沿着fail指针上溯,所经过的都是以当前节点为右端点的字串,也就是说fail[i]代表的字串在i中一定出现过。所以我们把fail边反向,出现了一颗fail树,那么如果一个串在P位置上出现了,那么在它的所有儿子中一定也出现了,于是可以用树状数组维护这棵fail树的dfs序来维护答案。 方法是:按照一开始建A... 阅读全文
摘要:
前几天被substr虐了,于是怒而学后缀自动机,结果看了一下午没看懂,囧.......昨天总算是看出点端倪了,发现写起来还是挺短的,起码比后缀数组好写多了~!原理什么的CLJ大神的课件里讲的已经很细致了,比网上的一些讲的都要透彻,建议初次学习的话还是去看这个。其实一个后缀自动机里的点代表的不光是它自己,还包括所有以它为右端点的字串(曾经的后缀),那么后缀自动机上就可以处理一些字串以及后缀的问题了。它的时空复杂度都是O(n)的,所以可以非常有效地解决一些字符串问题。这个图可以非常直观地表现后缀自动机的神奇之处:1.0 NSUBSTR 这个题用后缀自动机做真是一目了然啊,写完才60行....... 阅读全文