P3193题解

题目链接: P3193

一道很好的综合题目。

一、题意分析

简化题意:给定一个仅含数字的长度为 M 的模式串,请用数字填充一个长度为N的空串,使得模式串无法与该串的任何子串匹配。

二、解法分析

1.爆搜

首先想到爆搜。用10种方案填n个空,是O(10n)的复杂度,加上O(n)的判等,总复杂度是O(n10n)的。但是n=109...

爆炸

2.   dp

题目中有两个串,容易想到定义dp[i][j]为在串中填了i位,符合与模式串的j位无法匹配的方案数。

那么dp的边界就很清楚了:依据定义, dp[0][0]=1 (空串与空串必然匹配啊)。

下来思考转移。显然这里的转移要由两个维度转移而来,可以想到要预处理出模式串中满足前i位的数转移到满足前j位的方案数。我们令这个方案数为g[i][j]。设dp[i][j]dp[i1][k]转移而来,那么显然dp[i][j]+=dp[i1][k]×g[j][k]

显然这个 g[i][j] 是恒定不变的,且i<m,j<m(不然怎么转移?)且只与模式串有关。而模式串的长度是M20,可以放心预处理。

那么怎么预处理呢?

思考一个问题:长度由j增加到i必然可以转移的条件是什么?

如果一个长度为j的串已经不匹配了,现在要转移到i处去,那只需要填上所有原来模式串的内容就可以了。但前提是填上的内容要在这个串里出现过(不然出现别的串,不满足了)。

听不懂?很正常。来,举个例子。设模式串为12345612389,如果前9位3处已经不匹配,那么后三位就可以直接

41dfd1ef-d9f5-47da-82ed-9fd3cbf4e65e
posted @   长安19路  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示