AC自动机
AC自动机,可以理解为Trie树上跑KMP(应用类似KMP的next数组思想),为了解决多个字符串在一个大串上匹配的问题。
首先,几条总结的性质:
- 一个点的fail指针指向的点到root形成的字符串一定是这个点到root形成的字符串的后缀。
- 可以在fail指针形成的树上进行各种我们正常在树上进行的操作。
- 一个点的bfs序一定比它fail指向的点的bfs序大。
正常AC自动机(基础的就不说了)
- 统计每个小串在大串中出现多少次:
由于一个点fail指向的点到根形成的字符串一定是当前点形成字符串的子串,所以我们可以记录大串在自动机上每个点经过几次,在由这点向他的fail转移(建个fail树,跑个dfs即可)(例) - 查询每个小串在大串上最大前缀匹配长度
用大串在AC自动机上跑,经过点形成字符串一定是大串的子串(同时跳fail,标记这个被经过点fail能跳到的所有点),最后再将小串们在自动机上跑一遍,统计答案。(例)。 - 若要构造一个无限长大串,使每个小串都不是他的子串,否能不能。在自动机上找一个没有任何终点标记的环。(例)
AC自动机+DP
AC自动机建出来之后其实就是一张图,可以在图上跑DP;