bzoj4180: 字符串计数(口胡
我们考虑给你一个最终构造出来的串,他最小次数是怎么被构造出来的
那么就是从前往后扫,在SAMSAMSAM上跑,如果跑不动了那就从头开始走,并且把次数累加
显然这样构造是最小的…
那么我们预处理一个数组dis[i][j]dis[i][j]dis[i][j],表示在SAMSAMSAM上以iii字符开头,并且要求下一个串的开头是jjj的最小串长
然后就可以愉快二分+矩乘/倍增floyd了
注意nnn有1e181e181e18,所以弄的时候如果加起来大于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即可
博客围绕bzoj系列题目展开,涉及字符串计数、最短不公共子串、最长公共子串等问题。对于字符串计数,通过预处理数组、二分和矩乘求解;最短不公共子串分四问,采用枚举、转移等方法;最长公共子串经差分后转化为区间数颜色问题;还介绍了虚树板子及相关dp。
1098

被折叠的 条评论
为什么被折叠?



