[南海云课堂] [DP] [方案数计数] [问题转换] 同义串
洛谷链接
题意
对于单词(字符串)
设
如果一个词可以通过零次或多次运算转换成另一个词,则我们认为这两个词的意思是一致的。
运算仅仅包含以下两种方式。
- 方式一:指定任意一个位置
p (1 \le p \le len) 使s_p 上的字母变成 字母表上 的后一个字母(如 a 变成 b ,x 变成 y),而s_{p+1} 则要变成 字母表上 的前一个字母(如 d 变成 c)。 - 方式二:指定任意一个位置
p (1 \le p \le len) 使s_p 上的字母变成 字母表上 的前一个字母,而s_{p+1} 则要变成 字母表上 的后一个字母。
你需要回答对于输入的单词,一共有多少种与它意思一致的单词。
另外,对于字母 a ,不能将它变成前一个字母(因为它在字母表上没有前一个字母),同理 字母 z 也不能变成后一个字母。
给出多个单词(字符串),你需要分别对它们做出回答,答案对
思路
不要被这冗长的题意吓到。
不妨将字符串的每一位视作数字,那么
每一次操作相当于
于是可得到关键性质:对于两个长度相等的串
还是构造法,每次将操作
于是不妨将
但是注意,每个板构成的区间的大小都必须在
那么
在查询之前递推即可,预处理时间复杂度是
代码
递推代码如下,我怕少算就多循环了几遍,不影响结果。
f[0][0]=1;
for(int i=1; i<=3000;i++){
for(int j=1; j<=min(j,1LL*105);j++){
for(int k=max(1LL*0,i-26); k<=i-1;k++){
f[i][j]=(f[i][j]+f[k][j-1])%mod;
}
}
}