KMP

  • 重点:失配nxtnxtnxt数组

    • 意义:nxt[i]nxt[i]nxt[i]表示在[0,i−1][0,i-1][0,i−1]内最长相同前后缀的长度
    • 图示:
      • 此时nxt[i]=jnxt[i]=jnxt[i]=j,即指向最长相同前后缀的后一位置,数值上是最长相同钱后缀的长度
    • 求法:假设我们已知nxt[i−1]nxt[i-1]nxt[i−1],想要求nxt[i]nxt[i]nxt[i]
      • 当str(nxt[i−1])=str(i−1)str(nxt[i-1])=str(i-1)str(nxt[i−1])=str(i−1),显然有nxt[i]=nxt[i−1]+1nxt[i]=nxt[i-1]+1nxt[i]=nxt[i−1]+1
      • 当str(nxt[i−1])≠str(i−1)str(nxt[i-1])\neq str(i-1)str(nxt[i−1])̸​=str(i−1),那么就要往更前面找。因为已知nxt[i−1]nxt[i-1]nxt[i−1],所以必定出现如下①、②的两段是[0...i−2][0...i-2][0...i−2]的最长相同前后缀。jjj是nxt[nxt[i−1]]nxt[nxt[i-1]]nxt[nxt[i−1]],所以只要jjj与i−1i-1i−1配对即可。如果不行,那就如此反复下去,一直到头。其实也可以把这个过程看作自己和自己匹配

一道题目:BZOJ 4974[Lydsy1708月赛]字符串大师

题目链接:BZOJ 4974[Lydsy1708月赛]字符串大师

  • 稍微做判断可得到,给出的perperper数组满足性质:pre[i]=i−nxt[i]pre[i]=i-nxt[i]pre[i]=i−nxt[i]
  • 于是求出nxtnxtnxt数组后考虑怎么构造,只要满足位置iii的值等于nxt[i+1]nxt[i+1]nxt[i+1]的值就行了。如果nxt[i+1]nxt[i+1]nxt[i+1]等于0,就在沿nxt移动过程中,打一下标记,最后取最小字典序就行了

AC code

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100005;
int n, nxt[MAXN], str[MAXN];
bool vis[MAXN][26]; int main()
{
scanf("%d", &n);
for(int i = 1, x; i <= n; ++i)
scanf("%d", &x), nxt[i] = i-x;
nxt[0] = -1;
for(int i = 0; i < n; ++i)
{
int j = nxt[i], k;
while(nxt[i+1] != j+1)
vis[i][str[j]] = 1, j = nxt[j];
if(~j) str[i] = str[j];
else
{
for(k = 0; k < 26; ++k)
if(!vis[i][k]) break;
str[i] = k;
}
}
for(int i = 0; i < n; ++i) putchar('a'+str[i]);
}

KMP + BZOJ 4974 [Lydsy1708月赛]字符串大师的更多相关文章

  1. bzoj 4974 [Lydsy1708月赛]字符串大师 KMP 最小循环元 构造

    LINK:字符串大师 给出一个字符串的每个前缀的最小循环元 还原字典序最小的原字符串. 一个比较显然的结论 或者说 学过KMP的都知道 对于每个前缀i求出nex数组后 那么i-nex[i]为最小循环元 ...

  2. BZOJ4974:[Lydsy1708月赛]字符串大师(逆模拟KMP)

    题目描述 一个串T是S的循环节,当且仅当存在正整数k,使得S是T k  Tk (即T重复k次)的前缀,比如abcd是abcdabcdab的循环节.给定一个长度为n的仅由小写字符构成的字符串S,请对于每 ...

  3. 【思维题 kmp 构造】bzoj4974: [Lydsy1708月赛]字符串大师

    字符串思博题这一块还是有点薄弱啊. Description 一个串T是S的循环节,当且仅当存在正整数k,使得S是T^k(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节 .给定一个长度 ...

  4. BZOJ4974:[lydsy1708月赛]字符串大师

    浅谈\(KMP\):https://www.cnblogs.com/AKMer/p/10438148.html 题目传送门:https://lydsy.com/JudgeOnline/problem. ...

  5. bzoj4974: [Lydsy1708月赛]字符串大师

    脑洞题...玄学 假如是a[i]!=i,说明构成了循环节长为a[i]的循环,那就去%一下(别想多)看一下是循环节中的第几个咯. 否则新填的这个不能和前面构成任何循环,那就不停往前跳去把不能填的标记一下 ...

  6. bzoj 4974: [Lydsy八月月赛]字符串大师

    4974: [Lydsy八月月赛]字符串大师 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 371  Solved: 190[Submit][Statu ...

  7. BZOJ4974 大视野1708月赛 字符串大师

    传送门 题目大意 给定一个字符串的每一个前缀的最短循环节长度,求符合要求的字典序最小的字符串. 题解 给定循环节最短长度就是给定了这个字符串$kmp$的$next$数组,即$X_i=i-next_i$ ...

  8. bzoj4974: [Lydsy八月月赛]字符串大师

    传送门 题目可转换为已知一个串kmp之后的nxt数组,求字典序最小的原串. 已知第i位结尾的串循环节长度位x,那么nxt[i]=i-x; 当nxt不为0时,s[i]=s[nxt[i]]; nxt为0时 ...

  9. 【刷题】BZOJ 4977 [Lydsy1708月赛]跳伞求生

    Description 小Q最近沉迷于<跳伞求生>游戏.他组建了一支由n名玩家(包括他自己)组成的战队,编号依次为1到n.这个游 戏中,每局游戏开始时,所有玩家都会从飞机上跳伞,选择一个目 ...

随机推荐

  1. 安装cnpm出现问题

    安装cnpm: 命令行中输入   npm install -g cnpm --registry=http://registry.npm.taobao.org 报:cnpm不是内部命令 解决方法:设置环 ...

  2. [转帖]java中的for循环

    java中的for循环 https://baijiahao.baidu.com/s?id=1621622990642364099&wfr=spider&for=pc 发现自己连 for ...

  3. [Linux] 在 Ubuntu 19.10 上开启 SSH 服务并允许远程登录

    在 Ubuntu 19.10 上安装 SSH,并开启服务 0.检查并确认系统当前是否已安装SSH: sudo ps -e | grep ssh 如果只有 ssh-agent 说明 ssh-server ...

  4. Qt中 布局管理器失效问题

    1 问题描述 在Qt5.12.0 版本中,使用 自动管理器发生,无法生效 2 问题代码 Widget::Widget(QWidget *parent) : QWidget(parent), butto ...

  5. openjudge4979 - 海贼王之伟大航路 题解

    原题链接 题目简要分析 N个点,从1号点到N号点求最短路径,且每个点都要遍历到.现在要你求出最优方案. 这道题看到后,首先的想法莫过于搜索.暴力了.这显然不太可能.而进一步思考,使用Floyed和Di ...

  6. K8s-yaml的使用及命令

    YAML配置文件管理对象 对象管理: # 创建deployment资源 kubectl create -f nginx-deployment.yaml # 查看deployment kubectl g ...

  7. 「UR#5」怎样更有力气

    「UR#5」怎样更有力气 解题思路 考虑没有限制的情况,一定是把操作离线下来,按照边权从小到达做.可以发现,如果没有限制,完全图是多余的,直接拿树边进行合并就可以了.我们要做这么一件事情,把每个点属于 ...

  8. Partition5:Partiton Scheme是否指定Next Used?

    在SQL Server中,为Partition Scheme多次指定Next Used,不会出错,最后一次指定的FileGroup是Partition Scheme的Next Used,建议,在执行P ...

  9. vuex的Store简单使用过程

    介绍 Store的代码结构一般由State.Getters.Mutation.Actions这四种组成,也可以理解Store是一个容器,Store里面的状态与单纯的全局变量是不一样的,无法直接改变st ...

  10. PTA A1017

    A1017 Queueing at Bank (25 分) 题目内容 Suppose a bank has K windows open for service. There is a yellow ...