链接:https://ac.nowcoder.com/acm/contest/9981/A
题目描述 长度不超过n,且包含子序列“us”的、只由小写字母构成的字符串有多少个? 答案对1e9+7取模。 所谓子序列,指一个字符串删除部分字符(也可以不删)得到的字符串。 例如,”unoacscc”包含子序列”us”,但”scscucu”则不包含子序列”us”
思路 用递推的方法,通过在已有字符串的末端增加字符,从而逐步得到答案
f[i][0]表是长度为i的不含u的合法字符串数量
f[i][1]表示含u但是不含us的
f[i][2]表示含us的
那么可以得到
f[i][0]=f[i-1][0]*25,即在末尾加上一个除了u之外的字符
f[i][1]=f[i-1][1]*25(含有u了,那么加一个除了s之外的字符)+f[i-1][0] (在末尾加上u)
f[i][2]=f[i-1][2]*26(含有us了,那么随便加一个字符)+f[i-1][1] (前面有u无s,那么在末尾加上s)
代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include <cstdio> #include <iostream> using namespace std;#define ll long long const int maxn = 1e6 + 7 ;const ll mod = 1e9 + 7 ;int n;ll f[maxn][3 ], ans; int main () { scanf ("%d" , &n); f[1 ][0 ] = 25 ; f[1 ][1 ] = 1 ; f[1 ][2 ] = 0 ; for (int i = 2 ; i <= n; ++i) { f[i][0 ] = f[i-1 ][0 ] * 25 % mod; f[i][1 ] = (f[i-1 ][1 ]*25 % mod + f[i-1 ][0 ]) % mod; f[i][2 ] = (f[i-1 ][2 ]*26 % mod + f[i-1 ][1 ]) % mod; ans = (ans + f[i][2 ]) % mod; } printf ("%lld\n" , ans); return 0 ; }