Luogu P8112 [Cnoi2021] 符文破译 题解 [ 蓝 ] [ KMP ] [ 线性 dp ] [ 决策单调性 dp ]
符文破译:KMP + dp 的好题。
暴力 dp
不难打出一个暴力 dp:设计 \(dp_i\) 表示当前前 \(i\) 位全部完成了匹配,所需的最小分割数。
转移也是简单的,我们在 KMP 的过程中进行 dp 转移,每次选取 next 不断跳向再前面的 next,然后进行转移即可。
很显然一个字符集大小为 \(1\) 的串就能轻松卡掉这个,因为 KMP 的复杂度是基于均摊的,这个不满足均摊性质。时间是 \(O(n^2)\) 的。
决策单调性
我们观察每个 dp 值是如何做决策的,先是走到最长的匹配位置,然后匹配的长度不断减小。
同时,根据贪心思想,前面的 dp 值一定不比后面的 dp 值大。为啥呢,可以用反证法。假设前面的 dp 值比后面的 dp 值大,那么分割数必定比后面的多。如果后面的都能分割,又因为每一段都是模式串的前缀,所以一个成功分割的字符串无论你从后面删多少个数它都是合法的分割,这样前面的 dp 值一定能从后面的 dp 值的分割方案中求出。因此前面的 dp 值一定不大于后面的。
于是只要转移最长的 next 就可以了。
其他的注意一下无解判断即可。
时间复杂度 \(O(n)\)。
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
int n,m,dp[10000005],ne[10000005];
char s[10000005],t[10000005];
void solve()
{
memset(dp,-1,sizeof(dp));
dp[0]=0;
cin>>n>>m>>s+1>>t+1;
for(int i=2,j=0;i<=n;i++)
{
while(j&&s[j+1]!=s[i])j=ne[j];
if(s[j+1]==s[i])j++;
ne[i]=j;
}
for(int i=1,j=0;i<=m;i++)
{
while(j&&s[j+1]!=t[i])j=ne[j];
if(s[j+1]==t[i])j++;
if(dp[i-j]!=-1)dp[i]=dp[i-j]+1;
}
if(dp[m]!=-1)cout<<dp[m];
else cout<<"Fake";
}
int main()
{
//freopen("sample.in","r",stdin);
//freopen("sample.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}
Luogu P8112 [Cnoi2021] 符文破译 题解 [ 蓝 ] [ KMP ] [ 线性 dp ] [ 决策单调性 dp ]的更多相关文章
- bzoj 4899 记忆的轮廓 题解(概率dp+决策单调性优化)
题目背景 四次死亡轮回后,昴终于到达了贤者之塔,当代贤者夏乌拉一见到昴就上前抱住了昴“师傅!你终于回来了!你有着和师傅一样的魔女的余香,肯定是师傅”.众所周知,大贤者是嫉妒魔女沙提拉的老公,400年前 ...
- P8112 符文破译
题目描述 将字符串 \(T\) 拆成若干个子串,使这些子串为字符串 \(S\) 的前缀,要求拆分形成的子串数最小. 思路整理 实际上并不需要倒着枚举,也不需要线段树,更不需要 Z 函数. 如果你做过 ...
- luogu P1126 机器人搬重物 题解
luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...
- 【luogu P1850 换教室】 题解
题目链接:https://www.luogu.org/problemnew/show/P1850 难的不在状态上,难在转移方程. (话说方程写错居然还有84分= =) #include <cst ...
- 【luogu P1156 垃圾陷阱】 题解
题目链接:https://www.luogu.org/problemnew/show/P1156 设\(dp[i][j]\)表示前i堆到达高度j时的所活最长时间 那么一旦到当前状态能到达满足的时间和高 ...
- 更新一波题解(最近做的三个dp题)
很久没写题解了,去ec之前来填一填坑,希望能攒攒人品... 首先是去年上海F题..uvalive7143 题意: 给n个人分 m间房子,每个房间的容量是已知的,其中有k对双胞胎,双胞胎可以看作相同的人 ...
- luogu P3031 [USACO11NOV]高于中位数Above the Median (树状数组优化dp)
链接:https://www.luogu.org/problemnew/show/P3031 题面: 题目描述 Farmer John has lined up his N (1 <= N &l ...
- 【题解】LOJ2462完美的集合(树DP 魔改Lucas)
[题解]LOJ2462完美的集合(树DP 魔改Lucas) 省选模拟考这个??????????????????? 题目大意: 有一棵树,每个点有两个属性,一个是重量\(w_i\)一个是价值\(v_i\ ...
- luogu 3426题解 (KMP)
题面 Byteasar 想在墙上涂一段很长的字符,他为了做这件事从字符的前面一段中截取了一段作为模版. 然后将模版重复喷涂到相应的位置后就得到了他想要的字符序列.一个字符可以被喷涂很多次,但是一个位置 ...
- 【luogu P2491 [SDOI2011]消防】 题解
题目链接:https://www.luogu.org/problemnew/show/P2491 题外话: OI一共只有三种题--会的题,不会的题,二分题. 题解: step 1 求树的直径,把树的直 ...
随机推荐
- Spring Data JPA自动生成表时列顺序混乱的解决办法(最新版)
最近把Spring Boot的版本升级到了3.3.5,突然发现一个问题:当使用Spring Data JPA自动生成表的时候,所产生的列顺序与Entity类中的变量顺序不一致了.比如,有一个下面这样的 ...
- 使用SharpCompress压缩,tar.gz
之前我们介绍了如何用SharpZipLib来打.tar.gz压缩包. 但是这个压缩软件有两个问题,一是代码比较多,压缩起来没有那么方便:二是压缩的.tar.gz在linux上解压时会有警告,需要跳过这 ...
- 理解Flink之二Window与Watermark
Flnk作为流式计算平台,他能对源源不断发送过来的数据进行处理. 对于数据流的处理方式,可以是来一条处理一条(pipeline的方式),还可以获取一些数据然后统一处理. 对于数据流如何描述一堆数据呢? ...
- 【Java基础】-- instanceof 用法详解
1. instanceof关键字 如果你之前一直没有怎么仔细了解过instanceof关键字,现在就来了解一下: instanceof其实是java的一个二元操作符,和=,<,>这些是类似 ...
- 论文解读《Neural Cleanse: Identifying and Mitigating Backdoor Attacks in Neural Networks》
发表时间:2019 期刊会议:IEEE Symposium on Security and Privacy (S&P) 论文单位:UC Santa Barbara 论文作者:Bolun Wan ...
- VTK vtkAssembly 拾取
在有vtkAssembly的拾取中,vtkAssembly的Pickable决定子Actor能否被拾取.跟子Actor的Pickable没有关系
- 06C++顺序结构与程序IPO模式
一.程序IPO模式 编程 IPO 是指输入.处理和输出(Input, Process, Output)的概念.在计算机编程中,IPO 是一种常用的设计模式,用于描述程序的基本流程.具体来说,IPO 指 ...
- 使用IntersectionObserver 实现懒加载 && 记录一个懒加载失效的原因
先说说我实现懒加载失效的一个原因: 是图片没有写高度 猜想是没有给图片高度,所以底层没法进行计算 容器是否出现在视图中 IntersectionObservers作用 提供了一种异步观察目标元素与其祖 ...
- 中电金信:The Financial-Grade Digital Infrastructure
01 Product Introduction The Financial-Grade Digital Infrastructure is a digitally-enabled foundati ...
- Docker非root用户修改/etc/hosts文件
本文会讲解在Docker容器环境下,非root用户如何编辑修改/etc/hosts文件. 1.背景和需求描述 环境:Docker 运行用户:非root用户,如普通用户1001 需求:应用运行在容器内, ...