题意:

给你一个串,问你他的每个前缀的最小重复单元,其中单元是可以重叠的,最后按顺序输出即可。比如样例中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+1if (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;
}

转载于:https://www.cnblogs.com/ScratchingBear/p/5345825.html

Gym 100431E Word Cover 题解:KMP上跑dp相关推荐

  1. winpythonhadoop_让python在hadoop上跑起来

    本文实例讲解的是一般的hadoop入门程序"WordCount",就是首先写一个map程序用来将输入的字符串分割成单个的单词,然后reduce这些单个的单词,相同的单词就对其进行计 ...

  2. hadoopshpython_让python在hadoop上跑起来

    本文实例讲解的是一般的hadoop入门程序"WordCount",就是首先写一个map程序用来将输入的字符串分割成单个的单词,然后reduce这些单个的单词,相同的单词就对其进行计 ...

  3. python hadoop_让python在hadoop上跑起来

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

  4. zxing换行_为什么我的word里的横线上写完一行字不能自动换行,?

    匿名用户 7级 2010-10-21 回答 目前,我暂时知道的有:1你在WORD中同时按Ctrl+A时,可以选择整篇文章.2.F1 显示当前程序或者windows的帮助内容.    F2    当你选 ...

  5. 在M1芯片上跑原生Linux:编译速度比macOS还快40%,真香警告

    Alex 发自 凹非寺 量子位 | 公众号 QbitAI 现在,M1 Mac可以顺利运行原生Linux了. 专为苹果自研芯片打造的Asahi Linux项目,Alpha版本已经释出. 在Mac采用英特 ...

  6. 服务器跑python程序后还能安装网站吗_如何在服务器上跑python程序

    在服务器上跑python程序的方法: 登录服务器,将需要运行的python程序上传到服务器端,选择合适的python版本,运行python解释器,将程序路径添加进去执行就可以了 示例如下: windo ...

  7. elf section类型_在 498 行极小 OS 上跑标准 ELF 程序

    本文首发于 在 498 行极小系统跑标准 ELF 程序 简介 ELF 在 Linux 系统中作为标准可执行文件格式已经存在了 ~25 年. 如果要在 Linux 下直接研究 ELF,通常很难绕过 Li ...

  8. CF-1207 G.Indie Album(Trie上跑AC自动机)

    CF-1207 G.Indie Album(Trie上跑AC自动机) 题目链接 题意 nnn个串,串的生成方式有两种: 单独一个字符 在上一个串的基础上加一个字符 qqq个询问,问第iii个串中出现串 ...

  9. redis在windows10上跑起来

    redis在windows10上跑起来 原文:redis在windows10上跑起来 今天,开始学习redis,发现大多数redis都是在Linux上面运行的,可是我想把它放到windows上面运行, ...

最新文章

  1. 获取url的hash值
  2. 【Android】getActionBar()为null的解决方法总结
  3. LogMiner Tool
  4. 如何通过Windows Server 2008 R2建立NFS存储
  5. FD.io VPP官方邮件列表
  6. OpenGL基础55:文字渲染
  7. linux查看所有目录
  8. mysql数据表备份_MySQL数据库备份之逻辑备份和物理备份概述
  9. win10安装 Ruby on Rails 问题记录
  10. 迅雷下载百度网盘的资源
  11. 解决:RN和H5之间通信
  12. 三步棋,跟着bit鹏哥学得
  13. MOS管的行业应用领域-KIA MOS管
  14. 猿人学第五题上---代码
  15. p站自动收藏画作 post请求,request payload
  16. SAP_控制TECO生产订单不能发料及收货
  17. 获取cookies(pyppeteer)
  18. 基于MATLAB的小波阈值去噪
  19. LWN:5.17 合并窗口第一部分!
  20. Blender导出.fbx模型到Unity贴图丢失

热门文章

  1. 【vSphere系列二】安装 Openfiler 存储
  2. ORA-27301 解决一例
  3. 开通了一个gmail邮箱
  4. 【正一专栏】老夫老妻了,你还会说我爱你吗?
  5. 机器学习知识点(三十)LDA话题模型Java实现
  6. 国际会议排名zz(通信、网络类)
  7. 将.NET概念映射到Lightning平台
  8. 安装MySQL示例   docker pull mysql
  9. java的知识点30——设计模式
  10. Python+selenium 自动化 - 实现自动导入、上传外部文件实例演示