一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
二、解题报告
1、思路分析
我们将a~b 映射到0~25,那么对于每个和相同的字符串之间是否可以相互转化?
考虑一个字符串相当于一摞摞书,一次操作相当于将一本书拿到相邻摞上
显然是可以互相转化的
那么我们就可以dp来预处理
定义f(l, s)为长度为l,和为s的字符串的数目
f(l, s) = Σ f(l - 1, s - x),x in [0, 25]
然后对于查询我们输出f(l, s) - 1即可
2、复杂度
时间复杂度: O(nU^2)空间复杂度:O(nU)
3、代码详解
import sys
from math import inf
input = lambda: sys.stdin.readline().strip()
MII = lambda: map(int, input().split())
LMI = lambda: list(map(int, input().split()))
LI = lambda: list(input())
II = lambda: int(input())
fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
P = 10**9 + 7
def solve():
f = [[0] * 2501 for _ in range(101)]
f[0][0] = 1
acc = [0] * 2502
for i in range(1, 101):
for j in range(i * 25 + 1):
acc[j + 1] = (acc[j] + f[i - 1][j]) % P
f[i][j] = ((acc[j + 1] - acc[j - 25]) % P + P) %P
t = II()
res = []
for _ in range(t):
s = input()
n = len(s)
tot = sum(ord(x) - ord('a') for x in s)
res.append((f[n][tot] - 1 % P))
print('\n'.join(map(str, res)))
if __name__ == "__main__":
T = 1
# T = II()
for _ in range(T):
solve()