SAM的一些题?

博客围绕bzoj系列题目展开,涉及字符串计数、最短不公共子串、最长公共子串等问题。对于字符串计数,通过预处理数组、二分和矩乘求解;最短不公共子串分四问,采用枚举、转移等方法;最长公共子串经差分后转化为区间数颜色问题;还介绍了虚树板子及相关dp。

bzoj4180: 字符串计数(口胡

我们考虑给你一个最终构造出来的串,他最小次数是怎么被构造出来的
那么就是从前往后扫,在SAMSAMSAM上跑,如果跑不动了那就从头开始走,并且把次数累加
显然这样构造是最小的…
那么我们预处理一个数组dis[i][j]dis[i][j]dis[i][j],表示在SAMSAMSAM上以iii字符开头,并且要求下一个串的开头是jjj的最小串长
然后就可以愉快二分+矩乘/倍增floyd了
注意nnn1e181e181e18,所以弄的时候如果加起来大于1e181e181e18了就赋成1e181e181e18,这样就避免高精度的出现

bzoj4032: [HEOI2015]最短不公共子串

四合一?
第一问直接枚举第一个串的子串,在第二个串的SAM上跑
第二问直接枚举第一个串的子串,显然在第二个串中匹配的位置越前越好,那么直接转移
第三问就设一个f[i][j]f[i][j]f[i][j]表示在第一个串的第iii个位置,在第二个串的SAMSAMSAM上的第jjj个状态的最小值,扔进堆里做一个类似dij的
第四问直接f[i][j]f[i][j]f[i][j]表示第一个串的第iii个位置,第二个串的第jjj个位置,然后枚举262626个字符转移

bzoj4698: Sdoi2008 Sandy的卡片(口胡

差分一下就成了求nnn个串的最长公共子串,答案就是他们加一
可以把第一个位置强行变成不一样的
然后思考了一下就是一个区间数颜色问题…把每个点挂一个vector然后最后离线扫parent树的DFS序

bzoj3879: SvT

em收获一个虚树板子??
对反串建SAN,然后把parent树搞出来
两个状态的最长公共后缀就是他们的LCA的maxdepmaxdepmaxdep
那么把虚树建出来
随意dp即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值