BZOJ.1535.[POI2005]SZA-Template(KMP DP)
\(Description\)
给定一个字符串\(s\),求一个最短的字符串\(t\)满足,将\(t\)拼接多次后,可以得到\(s\)。拼接是指,可以将\(t\)放在当前串的任意位置,但要保证对应位置相同。(不太会说,看样例吧...)
\(|s|\leq5\times10^5\)。
\(Solution\)
首先\(t\)既是\(s\)的前缀也是\(s\)的后缀,即\(s\)的\(border\)、\(border\)的\(border\)...
考虑\(KMP\)建出\(fail\)树,那么\(t\)是\(n\)到根节点路径上的某个节点。考虑路径上怎样的节点是合法的。
\(s\)中能够放\(t\)的位置\(i\)满足,\(t\)是\(s[1...i]\)的\(border\)或者\(border\)的\(border\)...即在\(fail\)树中\(i\)在\(t\)的子树内。对于所有\(i\),要满足相邻的\(i\)之间的最大间距不超过\(|t|\),这样\(t\)就是合法的。
注意到从根节点到\(n\)的路径中,要维护的这个最大间距是递减的(每次删掉若干棵子树中的\(i\))。那么删除一个位置时,用链表维护下相邻位置的最大间距就可以了。
还有一个更简单的DP方法,看洛谷题解吧,我还不是很理解就不写了。
//20760kb 320ms
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=5e5+5;
int fail[N],H[N],nxt[N],way[N],L[N],R[N],Max;
char s[N];
inline void AE(int u,int v)
{
nxt[v]=H[u], H[u]=v;
}
void Delete(int x)
{
L[R[x]]=L[x], R[L[x]]=R[x], Max=std::max(Max,R[x]-L[x]);
for(int v=H[x]; v; v=nxt[v]) if(v!=way[x]) Delete(v);
}
int main()
{
scanf("%s",s+1); int n=strlen(s+1);
for(int i=2,j=0; i<=n; ++i)
{
while(j&&s[i]!=s[j+1]) j=fail[j];
fail[i]=s[i]==s[j+1]?++j:0;
}
for(int i=1; i<=n; ++i) L[i]=i-1, R[i]=i+1, AE(fail[i],i);
for(int x=n; x; x=fail[x]) way[fail[x]]=x;
int x=0;
for(Max=1; Max>x; x=way[x]) Delete(x);
printf("%d\n",x);
return 0;
}
BZOJ.1535.[POI2005]SZA-Template(KMP DP)的更多相关文章
- [BZOJ 1535] [Luogu 3426]SZA-Template (KMP+fail树+双向链表)
[BZOJ 1535] [Luogu 3426]SZA-Template (KMP+fail树+双向链表) 题面 Byteasar 想在墙上涂一段很长的字符,他为了做这件事从字符的前面一段中截取了一段 ...
- 2021.11.09 P3426 [POI2005]SZA-Template(KMP+DP)
2021.11.09 P3426 [POI2005]SZA-Template(KMP+DP) https://www.luogu.com.cn/problem/P3426 题意: 你打算在纸上印一串字 ...
- BZOJ.1009.[HNOI2008]GT考试(KMP DP 矩阵快速幂)
题目链接 设f[i][j]为当前是第i位考号.现在匹配到第j位(已有j-1位和A[]匹配)的方案数 因为假如当前匹配j位,如果选择的下一位与A[j+1]不同,那么新的匹配位数是fail[j]而不是0, ...
- bzoj 1537 [POI2005]Aut- The Bus(DP+BIT)
[题意] 顺序经过k个点,求获得的最大权值和. [思路] 设f[i]表示到第i个点,则有转移式: f[i]=min{ f[j]+w[i] } x[j]<=x[i],y[j]<=y[i] 满 ...
- bzoj 1537: [POI2005]Aut- The Bus 线段树
bzoj 1537: [POI2005]Aut- The Bus 先把坐标离散化 设f[i][j]表示从(1,1)走到(i,j)的最优解 这样直接dp::: f[i][j] = max{f[i-1][ ...
- [HDOJ5763]Another Meaning(KMP, DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5763 题意:给定两个字符串a和b,其中a中的字符串如果含有子串b,那么那部分可以被替换成*.问有多少种 ...
- POJ 3336 Count the string (KMP+DP,好题)
参考连接: KMP+DP: http://www.cnblogs.com/yuelingzhi/archive/2011/08/03/2126346.html 另外给出一个没用dp做的:http:// ...
- [BZOJ 4033] [HAOI2015] T1 【树形DP】
题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...
- 【KMP+DP】Count the string
KMP算法的综合练习 DP很久没写搞了半天才明白.本题结合Next[]的意义以及动态规划考察对KMP算法的掌握. Problem Description It is well known that A ...
随机推荐
- queryset优化 。。。。。exists()与iterator()方法
exists()方法!! 判断queryset是否有值存在.exists() 只会查询一个字段 .正常会查所有!!! iterator()方法 objs = Book.objects.all() ...
- Python生成随机验证码,大乐透号码
实例笔记之生成随机号码 扩展知识 - yield(生成器) 随机生成验证码 示例代码: import random # 导入标准模块中的random if __name__ == '__main__' ...
- MySQL5.7.20报错Access denied for user 'root'@'localhost' (using password: NO)
在centos6.8上源码安装了MySQL5.7.20,进入mysql的时候报错如下: 解决办法如下: 在mysql的配置文件内加入: vim /etc/my.cnf skip-grant-tabl ...
- 20165206 2017-2018-2 《Java程序设计》第七周学习总结
20165206 2017-2018-2 <Java程序设计>第七周学习总结 教材学习内容总结 MySqL:是世界上最流行的开源数据管理系统. 配置启动MySQL. 连接数据库:Conne ...
- 20165323 学习基础和C语言基础调查
20165323 学习基础和C语言基础调查 一.技能学习心得 1.你有什么技能比大多人更好? 我觉得我羽毛球打的还行,不能说打得比大多数人好,但是对于一些打羽毛球的要领还是掌握的. 2.针对这个技能的 ...
- Redis托管Session
一:redis托管session主要是为了不同域之间共享session.Asp.net提供了四种处理Session的方法 1. InProc模式 这是ASP.NET默认的Session管理模式,在应 ...
- 基于容器的ETCD集群脚本
其实是从上一篇的脚本里剥离出来的. 加深一下印象吧. docker run \ -d \ -p ${ETCD_CLI_PORT}:${ETCD_CLI_PORT} \ -p ${ETCD_CLU_PO ...
- sed 详解【转】
原文地址:http://www.cnblogs.com/sparkdev/archive/2017/07/10/7138073.html 基本命令格式 sed [常用选项] 命令文本 输入 常用选项 ...
- 清北合肥day2-day5
day2:215这一天的题目相对比较模板化t1:50看错了数据范围求n个点到给出的点哈夫曼距离的最小值我想到的是一种非常zz的做法我们二分答案,然后判断是否在这个距离内有点但是这样前缀和不是很好维护于 ...
- [转]PyCharm安装及使用
https://www.jianshu.com/p/042324342bf4 PyCharm 搭建环境 1.win10_X64,其他Win版本也可以. 2.PyCharm版本:Professional ...