AC自动机学习笔记

本文详细介绍了使用Trie树和fail指针进行字符串匹配的方法,包括单个短串和多个长串的匹配计数,以及如何处理多个短串与多个长串之间的匹配问题,并通过实例解释了如何利用Trie树解决各种字符串匹配任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值