JZOJ 4676. 【NOIP2016提高A组模拟7.21】模板串
来源:互联网 发布:重装系统数据恢复 编辑:程序博客网 时间:2024/06/05 21:08
Description
科学家温斯顿从数据库中找到了一串相当长的字符串。
他正试图用一个模板串来重构这个字符串。
他可以将模板串复制多份,通过合适的方式拼接起来,使得最终的串与原串一致。
如果两个模板串互相覆盖,那么覆盖的部分必须完全一致。
原串的所有位置必须被覆盖到。
显然,原串本身就是一个模板串。但为了节省成本,他想找到长度最短的模板串。
Input
第一行一个仅由小写字母构成的字符串。
Output
第一行一个整数,表示模板串的最小长度。
Sample Input
输入1:
ababa
输入2:
ababbababbabababbabababbababbaba
Sample Output
输出1:
3
输出2 :
8
Data Constraint
设字符串的长度为N。
Subtask1[20pts]:N<=100
Subtask2[30pts]:N<=25000
Subtask3[50pts]:N<=500000
Solution
我们设
F[i] 表示能覆盖前缀i 的 最短 的前缀。可以发现
F[i] 只有两种取值:F[next[i]] 和i 。因为能成为答案的前缀 只可能 同时是
i 的前缀和后缀。然后考虑什么条件下
F[i] 能等于F[next[i]] 。可以发现最后接上的一段最长是
next[i] 。如果这一段能被
F[next[i]] 覆盖的话,这一段前面那个前缀也必须能被F[next[i]] 覆盖。因为
F[next[i]] 满足自身不能再被覆盖。所以我们直接在区间
[i−next[i],i] 中寻找是否有一个j 满足F[j]=F[next[i]] 。若存在则
F[i] 可等于F[next[i]] 。实现的话开一个桶,
h[i] 表示F[j] 值为i 的最大的j ,就可以做到O(n) 了。
Code
#include<cstdio>#include<cstring>using namespace std;const int N=500005;int next[N],f[N],h[N];char s[N];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=next[j]; if(s[i]==s[j+1]) j++; next[i]=j; } for(int i=1;i<=n;h[f[i]]=i++) { int x=f[next[f[i]=i]]; if(h[x]>=i-next[i]) f[i]=x; } printf("%d",f[n]);}
阅读全文
1 0
- JZOJ 4676. 【NOIP2016提高A组模拟7.21】模板串
- JZOJ 4675. 【NOIP2016提高A组模拟7.21】Double-row
- JZOJ4676. 【NOIP2016提高A组模拟7.21】模板串
- JZOJ 4628 立方体【NOIP2016提高A组模拟7.15】
- JZOJ 4629 修路【NOIP2016提高A组模拟7.15】
- JZOJ 4630 计数【NOIP2016提高A组模拟7.15】
- JZOJ 4603 颜料大乱斗【NOIP2016提高A组模拟7.15】
- JZOJ 4647 寻找 【NOIP2016提高A组模拟7.17】
- JZOJ.4692【NOIP2016提高A组模拟8.14】传送带
- JZOJ.4699【NOIP2016提高A组模拟8.15】Password
- JZOJ 4699 Password【NOIP2016提高A组模拟8.15】
- JZOJ.4701【NOIP2016提高A组模拟8.15】Throw
- [JZOJ 4699][CF583C]【NOIP2016提高A组模拟8.15】Password
- JZOJ.4710【NOIP2016提高A组模拟8.17】Value
- JZOJ 4709 Matrix【NOIP2016提高A组模拟8.17】
- [Jzoj 4709]. 【NOIP2016提高A组模拟8.17】Matrix
- JZOJ 4710 Value【NOIP2016提高A组模拟8.17】
- JZOJ.4709【NOIP2016提高A组模拟8.17】Matrix
- go语言学习之-------go httpserver进阶之路go(2)
- gdb打印抽象数据类型vector
- Java语言基础——类与对象
- leetcode之Best Time to Buy and Sell Stock问题
- android国际化
- JZOJ 4676. 【NOIP2016提高A组模拟7.21】模板串
- Ajax跨域问题:跨域请求设置withCredentials
- node.js---入门学习
- 公办幼儿园教师要涨工资了???
- 来自滕州市全体农村学前教育一线教…
- ds1302
- 手机AT指令 AT+CMGS发信息_…
- Java实现邮箱找回密码
- 彼得-德鲁克的《创新与企业家精神》一书之分享活动收获