const int N = 55, M = 105;
char s[N];
int nxt[N], f[N][N];
void kmp_pre(char s[], int n)
{
int j = 0;
nxt[0] = -1, nxt[1] = 0;
for (int i = 2; i <= n; i++)
{
while (j && s[i] != s[j + 1])
j = nxt[j];
if (s[j + 1] == s[i])
j++;
nxt[i] = j;
}
}
ll kmp(int n, char t[], int m)
{
kmp_pre(t, m);
int j = 0;
ll res=0;
f[0][0] = 1;
f(i,1,n)
f(j, 0, n-1)//把每种border视为一种状态
for (char k = 'a';k <= 'z';k++)//拓展每种状态出边
{
int tmp = j;
while (tmp> 0 && s[tmp+ 1] != k)
tmp= nxt[tmp];
if (s[tmp + 1] == k)tmp++;
if (tmp < m)f[i][tmp] = (f[i][tmp] + f[i - 1][j]) % mod;
}
f(i, 0, n - 1)res = (res + f[n][i]) % mod;
return res;
}
int main()
{
//freopen("in.txt", "r", stdin);
int n = in();
scanf("%s", s+1);
int len = strlen(s+1);
cout << kmp(n, s, len);
return 0;
}
AcWing 1052. 设计密码(状态机+kmp)
最新推荐文章于 2022-04-05 22:06:32 发布