题意:

给你一个串,问你他的每个前缀的最小重复单元,其中单元是可以重叠的,最后按顺序输出即可。比如样例中abaabaa的最小重复单元为abaa,所以相应输出为4。

样例:

input : abaabaababa

output:1 2 3 4 5 3 4 5 3 10 3

kmp过程就不用多说了,现在我们利用next数组的性质来对问题进行求解。

我们首先用一个ans[maxn]数组来记录最后的答案,且我们的字符串下标从0开始,显然,我们ans[i]的最大值为i+1,我们因此也用此值对其进行初始化。

现在我们考虑什么情况下ans[i]可以得到更小的,更小他能达到多小。

其实这个显然可以知道第i位的ans值只能从ans[next[i]]那里获得,这个就可以根据next数组的性质想一想就明白了,若存在更短的,到i的后面的这段就不成立了。

然后我们考虑i和next[i]位置的两种情况:

第一种情况:i - next[i] ≤ next[i]

此时显然就可以利用ans[next[i]]进行更新了,如果可以形成前面这段,那么一定可以形成后面那段。

第二种情况:i - next[i] > next[i]

这种情况就是此题的难点所在了,乍看之下似乎这种情况下只能放弃用ans[next[i]]来更新ans[i]了,其实不然!!!

样例就给我们了很好的反例,因为样例最后一位的答案是3!

我们用dp[k]来记录最后ans是k的最大的下标,我们假设cnt = ans[next[i]],即在next[i]处的答案,然后如图:

一个比较显而易见的是cnt ≤ next[i]是肯定成立的,而此种假设下我们假设i - next[i] ≤ next[i],现在决定最终成败的就只剩下dp[cnt]的具体位置了!!!

我们证明 i - dp[cnt] ≤ cnt 时的情况必然可以用cnt来更新ans[i]。

此时状况完全如上图所示,此时在dp[cnt]前已经得知必可由长度为cnt的串来产生,而这cnt长得串同时也肯定是从0到next[i]中长度为cnt的后缀。那么根据next数组的性质,这段串与i-cnt ~ i这段是相同的。我们又假设了 i - cnt ≤ dp[cnt] ,因此我们的i-cnt ~ i这段必然可由与形成dp[cnt]长度相同的串来产生,同时这也是其所有可能的最小答案。

最后当next[i] = -1 的时候就没什么说的了,显然上面说的这些都没用了,直接就赋值给 ans[i] = i + 1,再更新一下 dp[ans[i]] = i 就可以了。

在此表达对此神作法的膜拜之情!

本弱渣的代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm> using namespace std; char word[250010];
int next[250010], ans[250010], dp[250010]; int main() {
freopen("cover.in", "r", stdin);
freopen("cover.out", "w", stdout);
scanf("%s", word);
int len = strlen(word), k = -1;
next[0] = -1;
for (int i = 1; i < len; i++) { // KMP构造next数组过程
while (k != -1 && word[i] != word[k + 1]) k = next[k];
if (word[i] == word[k + 1]) k++;
next[i] = k;
}
for (int i = 0; i < len; i++) {
ans[i] = i + 1; //首先赋值最大的可能值i+1
if (next[i] != -1) {
int cnt = ans[next[i]];
if (i - next[i] <= next[i] || i - dp[cnt] <= cnt) {
ans[i] = cnt;
}
}
dp[ans[i]] = i; //用ans[i]去更新dp[ans[i]]
}
for (int i = 0; i < len - 1; i++) printf("%d ", ans[i]); printf("%d\n", ans[len - 1]);
return 0;
}
												

Gym 100431E Word Cover 题解:KMP上跑dp的更多相关文章

  1. BZOJ 1023: [SHOI2008]cactus仙人掌图 | 在仙人掌上跑DP

    题目: 求仙人掌直径 http://www.lydsy.com/JudgeOnline/problem.php?id=1023 题解: 首先给出仙人掌的定义:满足所有的边至多在一个环上的无向联通图 我 ...

  2. 让python在hadoop上跑起来

    duang~好久没有更新博客啦,原因很简单,实习啦-好吧,我过来这边上班表示觉得自己简直弱爆了.第一周,配置环境:第二周,将数据可视化,包括学习了excel2013的一些高大上的技能,例如数据透视表和 ...

  3. 让“是男人就下到100层”在Android平台上跑起来

    原工程:https://github.com/jeekun/DownFloors 移植后的代码:HelloCpp.zip 移植后的APK:HelloCpp.apk 说明:(cocos2d-x版本是“ ...

  4. tomcat6~7~8用户设置及一个独立服务器上跑多个tomcat配置JVM设置优化亲测

    tomcat6管理用户 在tomcat `安装根目录`/conf/tomcat-users.xml

  5. 在win7上跑基于任少卿作者代码修改的RPN+BF实验

    1.前言 之前在win10上成功的跑起来faster-rcnn的实验,并且跑了一下CaltechPedestrian的数据集,但是效果一直不理想,折腾了好久也没弄清楚到底原因出在哪里,直到读了Is F ...

  6. 在free bsd上跑JMeter 的 plugin "PerfMon Server Agent"

    在free bsd上跑JMeter 的 plugin "PerfMon Server Agent" 目的: 在free bsd上跑JMeter 的 plugin "Per ...

  7. Python3.7.2,在Linux上跑来跑去的,是在升级打怪么?

    Python3.7.2,在Linux上跑来跑去的,是在升级打怪么?   前不久,发布了Python在Windows(程序员:Python学不学?完全没必要纠结)和Mac OS(我是Python,P派第 ...

  8. Office WORD如何在图片上添加文字

    如图所示,在图片格式中选择图片衬于文字下方即可,这样看起来感觉就像在图片上直接加字一样,没有生硬的感觉. 最终效果: Word如何在图片上添加文字Word如何在图片上添加文字Word如何在图片上添加文 ...

  9. [转载]Java动态填充word文档并上传到服务器

    一. 需求背景 在一些特殊应用场合,客户希望在服务器上生成文档的同时并填充数据,客户端的页面不显示打开文档,但是服务器上生成文档对服务器压力很大,目前服务器上生成文档第一种就是方式是jacob, 但是 ...

随机推荐

  1. c++11 继承构造函数

    若基类拥有数量众多的不同版本的构造函数,而派生类中只有一些成员函数,则对于派生类而言,其构造函数就等同于构造基类. struct A { A(int i) {} A(double d, int i) ...

  2. for循环语句示例

    for循环语句示例 一判断/var/目录下所有文件的类型 完整脚本 [root@centos73 ~]# cat shell_scripts/filetype.sh #!/bin/bash #Auth ...

  3. Linux的软件包管理

    此博客的环境任意. 主题Linux的软件包管理 一软件管理工具 1编译安装      2rpm包管理          3yum管理 二软件运行和编译 1ABI 应用程序的二进制接口 ABI:Appl ...

  4. 【LeetCode 41】缺失的第一个正数

    题目链接 [题解] 先明确一点假设给的数字有n个. 那么最后的答案最情况下就是n+1 首先我们先判断一下所给的数组里面有没有1 如果没有直接返回1 否则. 把数组中所有的范围超过n或者小于1的数字全都 ...

  5. Linux系统之-常用命令及技巧

    一. 通用命令:1.date :print or set the system date and time2. stty -a: 可以查看或者打印控制字符(Ctrl-C, Ctrl-D, Ctrl-Z ...

  6. BZOJ 3569: DZY Loves Chinese II(线性基)

    传送门 解题思路 首先构造出一个生成树,考虑不连接的情况.假设连通两点的非树边和树边都断掉后不连通,那么可以给所有的非树边随机一个互不相同的值,然后树边的权值为过他两端点的非树边权值的异或和,这个可以 ...

  7. Another Blog

    I also hold a blog with thoughts of English learning. Get there ===>. It's a private blog. Actual ...

  8. undefined null测试

    测试浏览器:chrome 当有父元素的子元素未定义时undefined和null均为true,类型为undefined 当元素赋给null后undefined和null均为true,类型为object ...

  9. django更换默认数据库sqlite3为pymsql后出现Keyerror:255的解决办法----升级PyMySQL

    一.更换数据库的办法: 1.安装PyMySQL 2.修改project目录同名文件下的settings.py:DATABASES = { 'default': { # 'ENGINE': 'djang ...

  10. 关于最近练习PYTHON代码的一点心得

    做测试以来,一直想学习代码,以前也断断续续的学习过,不过都是练习一些基础语法,学习的是菜鸟教程,但是效果不大. 最近在练习CODEWAR里做练习题,慢慢强化自己对一些基本语法的理解,熟悉基本的内置函数 ...