10.5 字符串统计

题意

定义一个对字符串的操作为删去该串的任意一个连续子串,并把剩下的部分拼接成一个字符串

给定一个字符串\(S\),请计算有多少个长度为\(N\)的字符串,无论怎样对其进行操作都无法使它成为字符串\(S\)


解法

补集转换一下,答案就是总的字符串个数\(26^N\)减去不合法的字符串个数

不合法的字符串可以看成是在\(S\)串的内部加入连续\(N-S\)个字符形成的

那么,对于每一个\(S\)串中可插入的空位(共\(S+1\)个),我们都能插入\(N-S\)个字符,形成的字符串就有\((S+1)\times 26^{N-S}\)个。但显然这样形成的字符串是有重复的,考虑不重不漏的计算

可以把长度为\(N-S\)的字符串在\(S\)中的添加视为窗口式的滑动,那么一开始字符串在\(S\)的右端,此时的方案为\(26^{N-S}\),窗口向左滑一格,把\(S\)的最右边的元素挤到整个字符串的右端

此时的方案是同样\(26^{N-S}\),但这里的方案与前面的方案有重合。我们钦定加进的字符串的第一个元素不同,(因为如果相同,我们可以发现这一层的窗口是被上一层的窗口完全包含的,也就是代表的方案也完全相同)那么也就能计算出与前面的方案没有重合的新方案\(25\times 26^{N-S-1}\)

可以发现对于每一个位置与前面的没有重合的方案都是\(25\times 26^{N-S-1}\)

那么最后的答案即为\(26^N-26^{N-|S|}-25\times 26^{N-|S|-1}\times |S|\)


扫描二维码关注公众号,回复: 7427730 查看本文章

猜你喜欢

转载自www.cnblogs.com/VeniVidiVici/p/11625187.html