修复密码(kmp+状态机dp)

构造的密码位置i和j+1进行匹配,如果i确定,j+1在kmp中的转移是确定的。f[i][j]表示密码构造到i位置,状态是j的方案,枚举i+1位置处放哪个字母,固定后,就可以知道当前状态可以连向哪些状态。dp的复杂度NM26,因为里面现找它的转移到的状态,所以应该再乘M,复杂度为26*N^3

#include<bits/stdc++.h>

using namespace std;

const int N=55,mod=1e9+7;

int n,m;
char str[N];
int f[N][N];

int main()
{
	cin>>n>>str+1;
	m=strlen(str+1);
	
	int ne[N]={0};
	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++;
				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;
}
全部评论

相关推荐

HR_丸山彩同学:你的项目描述里,系统设计讲了很多:MemCube是什么、三级存储架构怎么设计、四种遗忘策略分别是什么。这些面试的时候讲没问题,但简历上不需要这么细。 简历要突出的是影响力,不是实现细节。面试官看简历的时候想知道的是「这个项目有多大价值」,不是「这个项目具体怎么实现的」。实现细节是面试时候聊的 怎么改:技术细节可以精简为一句「采用三级存储架构+四种遗忘策略」,把省出来的篇幅用来写影响力。比如:项目有没有开源?有没有写成技术博客?有没有被别人使用过? 校园经历没有任何信息量,任何人都可以写这句话,写了等于没写。更关键的是,你投的是技术岗,校园活动经历本来就不是加分项。如果非要写,必须写出具体的数字和成果。如果你没有这些数字,那就老老实实删掉 「端到端耗时缩减30-40%」要给出确切数字和绝对值。从1000ms降到600ms是降了40%,从100ms降到60ms也是降了40%,但这两个含义完全不一样。其他也是,涉及到数据,准备好证据,口径统一,面试会问 「熟练」「熟悉」「了解」混在一起用,读起来很乱。而且「了解前端需求」最好改成「具备前后端协作经验」
点赞 评论 收藏
分享
Edgestr:没项目地址就干脆把那一栏删了呗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务