AcWing 1052. 设计密码(状态机模型)
原题链接
中等
作者:
宇小苏
,
2020-03-23 15:46:15
,
所有人可见
,
阅读 757
下标为i的位置的值假定为’x’,那么对于值’x’,j可以根据的状态表 (0, 1, …, m-1)从任何一个位置状态进行状态转移,因此使用u去枚举j的所有状态进行状态转移(u = ne[u]),只需满足u不能转化到m(最后一个位置)即符合条件,然而下标为i的位置的值能够取’a’ - ‘z’中的任何值,因此需要使用k去枚举i位置的所有可能的取值
import java.util.*;
class Main{
private static int mod = (int) 1e9 + 7;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String s = sc.next();
int m = s.length();
int[] p = new int[m+1];
for(int i = 1; i <= m; i++){
p[i] = s.charAt(i-1);
}
int[] ne = new int[m+1];
for(int i = 2, j = 0; i <= m; i++){
while(j != 0 && p[i] != p[j+1]) j = ne[j];
if(p[i] == p[j+1]) j++;
ne[i] = j;
}
int[][] f = new int[n+1][m+1];
f[0][0] = 1;
for(int i = 1; i <= n; i++){
for(int j = 0; j < m; j++){
for(char k = 'a'; k <= 'z'; k++){
int u = j;
while(u != 0 && k != p[u+1]) u = ne[u];
if(k == p[u+1]) u++;
if(u < m) f[i][u] = (f[i][u] + f[i-1][j]) % mod;
}
}
}
int res = 0;
for(int j = 0; j < m; j++) res = (res + f[n][j]) % mod;
System.out.println(res);
}
}