hdu 4622 Reincarnation (后缀自动机)

博客介绍了如何解决一个字符串问题,其中包含q个询问,要求计算给定区间内不同子串的数量。解决方案包括使用后缀数组和自动机,特别是强调了后缀自动机的方法。通过预先存储询问并按区间左端点和右端点排序,可以有效地在线性时间内得到答案。关键在于利用每次添加字符时新出现的子串数量来构建和更新自动机。
摘要由CSDN通过智能技术生成

题意:

给出一个串,q个询问,每个询问要求这个区间[l,r]不同子串的数目。

题解:

这题有两种做法,一种是后缀数组,一种是自动机,两种方法的思想是一致。

用自动机做之前要知道一个性质:每次加入某个字符,会到len[last]-len[fa[last]]个未出现过的子串,并且都是以last为结尾的。那么就好办了,我们并不好在在线获得答案,我们先将询问存下来,然后通过排序按照区间左端点为第一key,右端点为第二key。这样可以大大的降低复杂度。判断i区间的l是否等于i-1区间的l,如果相等从上次的last继续插入字符统计个数,如果不相等就从新建立自动机。这个算法是线性的。

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值