AC自动机 学习笔记

来源:互联网 发布:c语言做网页 编辑:程序博客网 时间:2024/06/05 09:45

Q:给出一坨短串,给出一个长串,求有多少个短串在长串中出现了。
A:把短串丢进trie树,建立fail指针,把长串在trie树上匹配,暴力蹦fail即可。每一个点只会被蹦一遍,打标记即可。

Q:给出一坨短串,给出一个长串,求每一个短串在长串中出现了多少次。
A:把短串丢进trie树,建立fail指针,把长串在trie树上匹配,能匹配上的点size都+1,然后建立fail树,统计每一个短串end节点的子树权值和即可。

Q:给出一个短串,给出一坨长串,求有多少个长串包含了短串。
A:把长串和短串都丢进trie树里,建立fail树。在fail树中,对于每一个长串的每一个点,判断其是否在短串的end节点的子树里。

Q:给出一坨短串,给出一坨长串,求每个短串出现在了几个长串里。
A:把短串丢进trie,建立fail树。把每一个长串都在trie树上匹配,匹配到的点到跟的路径上的短串的end节点权值都应该+1,然后单点查询短串end节点的权即可。不过这样比较麻烦,可以转化成单点打标记然后查询子树和。不过需要注意的是求短串的end节点是取并集,那么就需要按照dfs序排序然后将相邻两个点的lca-1,做一个容斥。

Q:给出一坨短串,给出一坨长串,求每一个长串中出现了多少个短串。
A:把短串和长串都丢进trie树,建立fail指针,在短串的end节点打标记。对于长串的每一个节点,在fail树上统计它到根的路径上有多少个标记。由于有可能计算重复,要应用容斥原理,即按照dfs序排序,然后每一次统计减去它前一个点和当前点的lca的答案。

0 0
原创粉丝点击