constint N = 55, mod = 1e9 + 7; int n, m; char str[N]; int f[N][N];
intmain(){ cin >> n >> str + 1; m = strlen(str + 1);
// KMP 求模板串的 next 数组 int ne[N] = {0}; for (int i = 2, j = 0; i <= n; i++) { while (j && str[i] != str[j + 1]) j = ne[j]; if (str[i] == str[j + 1]) j++; ne[i] = j; } // 当前密码已经生成了 0 位,且第 0 位匹配在子串中的位置为 0 的方案数,初始状态为 1 f[0][0] = 1; // 枚举生成的密码的位置 for (int i = 0; i < n; i++) { // 枚举 KMP 匹配到的子串中的位置,由于题目要求密码中不能包含子串,所以不能有 m for (int j = 0; j < m; j++) { // 枚举当前位置可以生成的字符的所有可能 a~z for (char k = 'a'; k <= 'z'; k++) { int u = j; while (u && k != str[u + 1]) u = ne[u]; if (k == str[u + 1]) 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; return0; }