AcWing 算法提高课 状态机模型 1052. 设计密码
dp中的状态机模型会增加一维表示当前的状态。根据状态间的转移方式进行dp
1052. 设计密码
此题需要结合kmp和状态机模型
状态的定义是 dp[i][j]表示遍历到字母i,且匹配了长度为j的模板串,匹配模板串的长度即为状态。
状态的转移根据i-1位的匹配长度,以及i位的字母,计算i位的匹配长度。
根据kmp数组p,i-i位的匹配长度j(遍历)以及i位的字母(遍历),计算可以转移到的i位置的匹配长度,然后dp求和。
代码如下

#include<bits/stdc++.h> using namespace std; typedef long long LL; LL dp[60][60]; int p[60]; int main() { int n; cin>>n; string str; cin>>str; int m=str.size(); str='0'+str; p[0]=0; int j=0; for(int i=2;i<=m;i++) { while(j&&str[i]!=str[j+1]) j=p[j]; if(str[i]==str[j+1]) j++; p[i]=j; } dp[0][0]=1; for(int i=1;i<=n;i++) { for(int j=0;j<m;j++) { for(char ch='a';ch<='z';ch++) { int tmp=j; while(tmp&&ch!=str[tmp+1]) tmp=p[tmp]; if(ch==str[tmp+1]) { dp[i][tmp+1]+=dp[i-1][j]; dp[i][tmp+1]%=1000000007; } else { dp[i][0]+=dp[i-1][j]; dp[i][0]%=1000000007; } } } } LL res=0; for(int i=0;i<m;i++) { res+=dp[n][i]; res%=1000000007; } cout<<res<<endl; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人