SZA-Template

题目链接:luogu P3426

题目大意

给你一个字符串,然后你可以选一个字符串来生成它。
每次你可以放一个你选的字符串到当前字符串上,然后如果后面一段跟前面一段相同,那你可以重叠上去。
(就是一个位置的字符可以被多次出现,但是不能出现不同的字符)
然后你能用的最短的字符串是多短。

思路

首先一个显然的事情是满足的字符串至少是字符串的 Border。
那考虑怎样一个 Border 才可以,那就是 fail 树上到 nnn 的路径上相邻点都要能凑出来。

至于怎么看能不能凑出来,那就是当前一个字符串它到下一个字符串,它起码要大于等于新多的长度(就是可以两个接一起得到新的),至于为什么这个就是 Border 定义,想想就知道。

那怎么看呢,我们考虑 dfs,每次到 Border 点就把别的兄弟删去,然后链表维护中间的距离,然后每次去儿子之前把自己删掉并且更新间隙大小,那就是要间隙大小小于等于你要看的点的长度。

代码

#include<cstdio>
#include<cstring>
#include<vector>using namespace std;const int N = 5e5 + 100;
char s[N];
int n, l[N], r[N], fail[N], ans, gap;
bool sp[N];
vector <int> G[N];void del(int now) {r[l[now]] = r[now];l[r[now]] = l[now];
}void dfs(int now) {if (sp[now] && now >= gap) {ans = min(ans, now);}for (int i = 0; i < G[now].size(); i++) { int x = G[now][i];if (sp[x]) continue;dfs(x);}if (l[now] && r[now] != n + 1) {gap = max(gap, r[now] - l[now]);}del(now);for (int i = 0; i < G[now].size(); i++) { int x = G[now][i];if (!sp[x]) continue;dfs(x);}
}int main() {scanf("%s", s + 1); n = strlen(s + 1);ans = n;G[0].push_back(1);for (int i = 2, j = 0; i <= n; i++) {while (j && s[i] != s[j + 1]) j = fail[j];if (s[i] == s[j + 1]) j++; fail[i] = j; G[j].push_back(i);}int now = n; while (now) sp[now] = 1, now = fail[now];for (int i = 1; i <= n; i++) l[i] = i - 1, r[i] = i + 1;gap = 1;dfs(0);printf("%d", ans);return 0;
}

【luogu P3426】SZA-Template(字符串)(KMP)相关推荐

  1. Vue 中是如何解析 template 字符串为 VNode 的?

    在接触 React 时候,我只了解到通过 babel 可以把 JSX 转成 VNode(通过调用 React.createElement 方法),但是对其具体是如何转换的却不了解. 很明显,回答失败. ...

  2. luogu 3618 误会 关于字符串Hash

    luogu 3618 误会 DP+Hash 题目链接 本题最后其实转化为字符串匹配问题. 直接用DP,状态转移,如果尾段匹配,f[i]=f[i-1]+f[i-len2],否则如果不匹配,f[i]=f[ ...

  3. 流动python - 字符串KMP匹配

    首先我们看一下简单的字符串匹配. 你可以把文本字符串s固定,模式字符串p从s对齐的左边缘,作为承担部分完全一致,匹配成功,失败将是模式字符串p整体向右1地点,继续检查对齐部分,重复. #朴素匹配 de ...

  4. leetcode459. 重复的子字符串(KMP)

    一:题目 二:上码 class Solution {public:void getIndex(int* next,string s){int i = 0;//前缀next[0] = 0;for(int ...

  5. HDU 2594 Simpsons’ Hidden Talents (字符串-KMP)

    Simpsons' Hidden Talents Problem Description Homer: Marge, I just figured out a way to discover some ...

  6. python实现Trie 树+朴素匹配字符串+RK算法匹配字符串+kmp算法匹配字符串

    一.trie树应用: 相应leetcode 常用于搜索提示,如当输入一个网址,可以自动搜索出可能的选择.当没有完全匹配的搜索结果,可以返回前缀最相似的可能. 例如三个单词app, apple, add ...

  7. 字符串 - KMP模式匹配

    在朴素的模式匹配算法中,主串的pos值(i)是不断地回溯来完成的(见字符串的基本操作中的Index函数).而计算机的大仙们发现这种回溯其实可以是不需要的.既然i值不回溯,也就是不可以变小,那么考虑的变 ...

  8. 字符串 kmp算法解析

    kmp算法是用于解析字符串匹配的问题.给定两个字符串:第一个是文本串str,第二个是匹配串p.问str中最早有那个位置能完全和匹配串p匹配呢? 1. 暴力匹配 假设文本串的长度为n,匹配串的长度为m. ...

  9. 查找子字符串----KMP算法深入剖析

    假设主串:a b a b c a b c a c b a b       子串:a b c a c 1.一般匹配算法 逐个字符的比较,匹配过程如下: 第一趟匹配 a b a b c a b c a c ...

最新文章

  1. Kindeditor视频上传问题处理
  2. python好用-Python里三个好用的调试神器
  3. 典型用户描述及进一步需求分析
  4. 内存条ar开头的如何看大小_软网推荐:明明白白看内存
  5. 请求的站点不可用或找不到_公厕再不是“找不到、用不了、坐不下”
  6. 50个Web设计师超便利的工具
  7. asp.net添加删除表格_如何用openpyxl自动化编写Excel电子表格
  8. Ubuntu12.04 内核树建立
  9. Java基础学习总结(118)——单元测试的必要性和重要性
  10. python入门基础知识实例-Python入门基础知识实例,
  11. CoreJavaE10V1P3.10 第3章 Java的基本编程结构-3.10 数组(Arrays)
  12. 百元百鸡 //构造结构体变量
  13. 微信小程序调用app.js里的函数
  14. WPF界面设计的模式
  15. 纵横公路造价软件学习_《纵横公路造价软件操作步骤.doc
  16. 2021年Robocom 复赛题解
  17. CGB2202API基础第1天
  18. 高数不定积分方法汇总:
  19. web前端开发工程师是做什么工作的?
  20. 码元传输速率计算及运用

热门文章

  1. 第一模块 jdk与jre、==与equals、Math.round(-1.5)、 String、操作字符串的类、字符串反转、抽象类必须要有抽象方法吗、普通类和抽象类、BIO NIO AIO
  2. Canvas画椭圆的方法
  3. 2022最新HTML生成国庆头像网页源码+打开即用
  4. Java+Appium+Junit demo
  5. Azure Information Protection信息保护(AIP)/Azure Rights Management权限管理(RMS)
  6. win7无法看到工作组计算机,Win7系统无法查看工作组问题的解决方法
  7. 【附源码】计算机毕业设计SSM网上商城比价系统
  8. 杰理之实现蓝牙三方通话功能【篇】
  9. 阿里云培训-OSS(对象存储)
  10. python ppt转图片_ppt一键转图片和pdf