Nowcodercontest5278I 古老的打字机(dp)
Nowcodercontest5278I 古老的打字机(dp)
分析:对于每个字符串算权值,每个字符串贡献的次数只与当前串的长度和打字打出串的总长度有关
1.计算打出了i数的方案数
dp[i][j]表示当前考虑i次,有j个字符打出来的方案数
dp[i][j]→dp[i+1][max(j−1,0)],dp[i][j]⋅26+dp[i+1][j+1]
2.对于每种长度i,枚举每个字符串的权值,固定从k开始长度为|sj|的字符,其他字符随便,对于固定的字符除去26|si|,乘上开始位置k的个数就能得到方案数
const int N=1e3+10,P=1e9+7;
int n,m;
char s[N][N];
int len[N],a[N];
ll Pow[N],C[N][N],IPow[N];
ll qpow(ll x,ll k) {
ll res=1;
for(;k;k>>=1,x=x*x%P) if(k&1) res=res*x%P;
return res;
}
int main(){
Pow[0]=IPow[0]=1;
rep(i,1,N-1) Pow[i]=Pow[i-1]*26%P;
IPow[1]=qpow(26,P-2);
rep(i,1,N-1) IPow[i]=IPow[i-1]*IPow[1]%P;
n=rd(),m=rd();
C[0][0]=1;
rep(i,0,m-1) {
rep(j,0,i) {
(C[i+1][j+1]+=C[i][j]*26)%=P;
(C[i+1][max(j-1,0)]+=C[i][j])%=P;
}
}
rep(i,1,n) scanf("%s",s[i]+1),len[i]=strlen(s[i]+1),a[i]=rd();
ll ans=0;
rep(i,1,m) {
ll s=0;
rep(j,1,n) if(i>=len[j]) s=(s+1ll*(i-len[j]+1)*a[j]%P*IPow[len[j]])%P; // 权值贡献次数
ans=(ans+s*C[m][i])%P;//长度为i的所有次数
}
printf("%lld\n",ans);
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库