AC自动机

AC自动机,可以理解为Trie树上跑KMP(应用类似KMP的next数组思想),为了解决多个字符串在一个大串上匹配的问题。


首先,几条总结的性质:

  1. 一个点的fail指针指向的点到root形成的字符串一定是这个点到root形成的字符串的后缀。
  2. 可以在fail指针形成的树上进行各种我们正常在树上进行的操作。
  3. 一个点的bfs序一定比它fail指向的点的bfs序大。

正常AC自动机(基础的就不说了)

  1. 统计每个小串在大串中出现多少次:
    由于一个点fail指向的点到根形成的字符串一定是当前点形成字符串的子串,所以我们可以记录大串在自动机上每个点经过几次,在由这点向他的fail转移(建个fail树,跑个dfs即可)(
  2. 查询每个小串在大串上最大前缀匹配长度
    用大串在AC自动机上跑,经过点形成字符串一定是大串的子串(同时跳fail,标记这个被经过点fail能跳到的所有点),最后再将小串们在自动机上跑一遍,统计答案。()。
  3. 若要构造一个无限长大串,使每个小串都不是他的子串,否能不能。在自动机上找一个没有任何终点标记的环。(

AC自动机+DP
AC自动机建出来之后其实就是一张图,可以在图上跑DP;

  1. 若要求走k步,xxx。通常dp[i][j],i代表走了几步,j代表到自动机上哪个点。(),可能正着不好求,比如要求满足某条件有多少构造方案,可以反过来求不满足条件的有几种。(
  2. 结合概率。由于概率问题有很多都可以用概率dp来解。例题
posted @ 2024-12-06 20:07  煦阳gyy  阅读(11)  评论(0)    收藏  举报