欢迎光临散文网 会员登陆 & 注册

2021 EC-Final B. Beautiful String

2022-12-06 01:01 作者:Asunataisiki  | 我要投稿

题意:字符串s可以被分割为s%3Ds_1%2Bs_2%2Bs_3%2Bs_4%2Bs_5%2Bs_6,其中s_1%3Ds_2%3Ds_5%2Cs_3%3Ds_6,求整个字符串及其子串中有多少种字符串可以被这样分割

暴力做法:

题解参考:https://www.cnblogs.com/KIMYON/p/16842332.html

先考虑暴力做法,记 lcp%5Bi%5D%5Bj%5D 表示 i%20%20%20%5Crightarrow%20%20n 与 j%20%20%20%5Crightarrow%20%20n 的最长公共前缀,那么类似于 lcs 可以得到转移方程 lcp%5Bi%5D%5Bj%5D%20%3D%20(s%5Bi%5D%20%3D%3D%20s%5Bj%5D)%20%3F%20lcp%5Bi%20%2B%201%5D%5Bj%20%2B%201%5D%20%2B%201%20%3A%200,那么如果lcp%5Bi%5D%5Bj%5D%20%5Cgeq%20%20j-i,那么就说明以 i 到 j 这一段的字符串在 j 之后又再次出现了,那么我们就可以得到上图中最前面的蓝色两部分,特别的,在上图中可以发现,j之后出现的蓝色与橙色在k之后重复出现,那么我们可以在 lcp%5Bi%5D%5Bj%5D%20%5Cgeq%20%20j-i 之后枚举k(因为这样才找到了前面的两个蓝色部分),同样类似于之前的,如果有 lcp%5Bj%5D%5Bk%5D%20%3E%20j-i(只要比蓝色部分多就行了) 那么蓝色和橙色部分也重复出现,但是绿色部分的长度至少为1,所以 k 从 j%20%2B%203 开始枚举,同时 lcp%5Bj%5D%5Bk%5D%20%5Cleq%20k-j-1,那么答案就要加上min(lcp%5Bj%5D%5Bk%5D%2Ck-j-1)%20-%20(j-i),本着交一发试试的心态,然后不出意外就TLE了

优化:

    可以发现,求 lcp 的过程其实没办法去优化的,同时 i 和 j 也没办法优化,因为我们总是需要枚举两个点去找到蓝色部分,那么我们可以尝试优化 k,对于 lcp%5Bi%5D%5Bj%5D%20%5Cgeq%20%20j-i , 若存在 k 对答案有贡献,那么lcp%5Bi%5D%5Bj%5D 最少也是 j-i%2B1(+1是因为要有一个绿色部分),也就是说,从j 后面的第 j-i个字符开始到整个字符串末尾都有可能对答案产生贡献。

    记sum%5Bj%5D%5Blen%5D表示从j开始长度为 len 的贡献,若 lcp%5Bi%5D%5Bj%5D%20%5Cgeq%20%20j-i,那么根据上面的分析,sum%5Bj%5D%5Bj-i%5D%2Csum%5Bj%5D%5Bj-i%2B1%5D%2C...%2Csum%5Bj%5D%5B(%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%9C%AB%E5%B0%BE)%5D,都需要加一,显然这个是个差分然后求前缀和的过程。那么现在就可以枚举jk来计算贡献了,根据暴力解法,我们应该从j开始长度为j-i一直加到长度为min(lcp%5Bj%5D%5Bk%5D%2C%20k-j-1)-1这一段的sum值,也就是sum%5Bj%5D%5Bj%20-%20i%5D%20%2B%20sum%5Bj%5D%5Bj%20-%20i%20%2B%201%5D%20%2B%20...%20%2B%20sum%5Bj%5D%5Bmin(lcp%5Bj%5D%5Bk%5D%2C%20k%20-%20j%20-%201)%20-%202%5D%E3%80%81sum%5Bj%5D%5Bmin(lcp%5Bj%5D%5Bk%5D%2C%20k%20-%20j%20-%201)%20-%201%5D,那么这又是一个前缀和的过程,为了方便,我们可以把sum数组定义为差分数组,然后求两次前缀和就可以了

按理说O(n%5E2)应该是能过得,但是

那么就是一些小细节可以优化了,对于满足条件的贡献至多不超过原字符串长度的一半,因此sum第二维开到一半就够了。



2021 EC-Final B. Beautiful String的评论 (共 条)

分享到微博请遵守国家法律