你现在需要设计一个密码 SS
,SS
需要满足:SS
的长度是 NN
;SS
只包含小写英文字母;SS
不包含子串 TT
;例如:abcabc
和 abcdeabcde
是 abcdeabcde
的子串,abdabd
不是 abcdeabcde
的子串。请问共有多少种不同的密码满足要求?由于答案会非常大,请输出答案模 109+7109+7
的余数。输入格式第一行输入整数N,表示密码的长度。第二行输入字符串T,T中只包含小写字母。输出格式输出一个正整数,表示总方案数模 109+7109+7
后的结果。数据范围1≤N≤501≤N≤50
,
1≤|T|≤N1≤|T|≤N
,|T||T|
是TT
的长度。输入样例1:2
a
输出样例1:625
输入样例2:4
cbc
输出样例2:456924
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 55, mod = 1e9 + 7;
char str[N];
int f[N][N];
int ne[N];
int main(){
int n, m;
cin >> n >> str + 1;
m = strlen(str + 1);
for (int i = 2, j = 0; i <= m; i ++){
while(j && str[i] != str[j + 1]) j = ne[j];
if (str[i] == str[j + 1]) j ++;
ne[i] = j;
}
f[0][0] = 1;
for (int i = 0; i < n; i ++){
for (int j = 0; j < m; j ++){
for (char k = 'a'; k <= 'z'; k ++){
int u = j;
while (u && str[u + 1] != k) u = ne[u];
if (str[u + 1] == k) u ++;
if (u < m) f[i + 1][u] = (f[i + 1][u] + f[i][j]) % mod;
}
}
}
int res = 0;
for (int i = 0; i < m; i ++) res = (res + f[n][i]) % mod;
cout << res << endl;
return 0;
}