LGP3426题解
真是不管什么时候来做这道题都会觉得很神仙呐。。。
观察一下,如果存在一个合法的印章,那么这个印章一定是这个串的前缀,也是这个串的后缀。
即合法的印章一定是原串的 \(\rm Border\)。
于是设 \(dp[n]\) 为 \([1,n]\) 这个前缀的最短的印章长度。这个印章就是 \([1,dp[n]]\)。
注意到 \(dp[fail[n]]\) 的长度不可能大于 \(dp[n]\),所以 \(dp[n]\) 其实只有两种决策:\(n\) 和 \(dp[fail[n]]\)。
于是开始思考满足什么条件的情况下才能够使用 \(dp[fail[n]]\)。
注意到 \([1,dp[fail[n]]]\) 一定是 \([1,n]\) 的后缀,所以我们假设这个印章已经把这个后缀狂暴轰入了,那么 \([1,n-dp[fail[n]]]\) 还没有被轰入。所以条件就是 \([1,n-dp[fail[n]]+1]\sim [1,n]\) 这几个前缀中的某一个的前缀的 \(dp\) 值为 \(dp[fail[n]]\)。(也就是轰入这个前缀之后,再使用这个印章轰入后缀。)
看似需要维护区间 \(\max\)?其实并不需要,只需要对每一个 \(dp\) 值维护最右边的下标即可。
代码很短,但是思维量是很多的。
#include<cstring>
#include<cstdio>
typedef unsigned ui;
const ui M=5e5+5;
ui n,dp[M],mx[M],fail[M];char s[M];
signed main(){
ui i,j;scanf("%s",s+1);n=std::strlen(s+1);
for(i=1,j=0;i<=n;++i){
if(i==1)fail[i]=0,dp[i]=1,mx[1]=1;
else{
while(j&&s[j+1]!=s[i])j=fail[j];if(s[j+1]==s[i])++j;fail[i]=j;
if(mx[dp[j]]>=i-j)dp[i]=dp[j];else dp[i]=i;mx[dp[i]]=i;
}
}
printf("%u",dp[n]);
}
LGP3426题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- bom-删除提示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- android 如何动态设置View的margin和padding
感谢大佬:https://blog.csdn.net/a107494639/article/details/7341077 1.动态设置padding,拿ImageView为例: ImageView ...
- iOS测试模板
测试模板,每次写一个功能测试Demo时总是要新建一个工程,导入一些第三方库,比较麻烦,先提供一个测试模板,提供一些常用第三方库,自己就不用导了 使用Cocospod管理第三方库 常用(其他自行添加) ...
- 安装Linux8.3.2011
镜像地址:http://mirrors.aliyun.com/centos/8.3.2011/isos/x86_64/ 非DVD镜像安装时的安装源地址:http://mirrors.aliyun.co ...
- C++实现对Json数据的友好处理
背景 C/C++客户端需要接收和发送JSON格式的数据到后端以实现通讯和数据交互.C++没有现成的处理JSON格式数据的接口,直接引用第三方库还是避免不了拆解拼接.考虑到此项目将会有大量JSON数据需 ...
- java+selenium脚本编写规范
2. 源文件规范 2.1 文件名 源文件以最顶层的类名来命名,大小写敏感,文件扩展名为.java 2.2 文件编码 UTF-8 源文件要求编码格式为UTF-8 2.3 源文件结 ...
- 6 小时 Python 入门
6 小时 Python 入门 以下操作均在 Windows 环境下进行操作,先说明一下哈 一.安装 Python 1.官网下载 Python 进入官网(https://www.python.org), ...
- 12、Linux基础--挂载磁盘步骤、流处理工具awk(正则 比较 逻辑 算数表达式 流程控制)
笔记 1.晨考 1.用两种方法,实现将文件中的以# 开头的行把# 去掉 sed -r 's/^#//g' /etc/fstab cat /etc/fstab | tr -d '^#' 2.将文件中的H ...
- 依赖于angular的table组件
组件实现了以下功能 1. 列宽可动态拖动 2. 列数据排序 3. 列过滤 4. 列位置自由调整 除了需要引入angular.js(我用的是1.4.6版本),还需要引用一个angular衍生出来的插件n ...
- JVM学习——学习方法论&学习大纲
2020年02月06日22:25:51 完成了Springboot系列的学习和Kafka的学习,接下来进入JVM的学习阶段 深入理解JVM 学习方法论 如何去学习一门课程--方法论 多讨论,从别人身上 ...