KMP + BZOJ 4974 [Lydsy1708月赛]字符串大师
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月赛]字符串大师的更多相关文章
- bzoj 4974 [Lydsy1708月赛]字符串大师 KMP 最小循环元 构造
LINK:字符串大师 给出一个字符串的每个前缀的最小循环元 还原字典序最小的原字符串. 一个比较显然的结论 或者说 学过KMP的都知道 对于每个前缀i求出nex数组后 那么i-nex[i]为最小循环元 ...
- BZOJ4974:[Lydsy1708月赛]字符串大师(逆模拟KMP)
题目描述 一个串T是S的循环节,当且仅当存在正整数k,使得S是T k Tk (即T重复k次)的前缀,比如abcd是abcdabcdab的循环节.给定一个长度为n的仅由小写字符构成的字符串S,请对于每 ...
- 【思维题 kmp 构造】bzoj4974: [Lydsy1708月赛]字符串大师
字符串思博题这一块还是有点薄弱啊. Description 一个串T是S的循环节,当且仅当存在正整数k,使得S是T^k(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节 .给定一个长度 ...
- BZOJ4974:[lydsy1708月赛]字符串大师
浅谈\(KMP\):https://www.cnblogs.com/AKMer/p/10438148.html 题目传送门:https://lydsy.com/JudgeOnline/problem. ...
- bzoj4974: [Lydsy1708月赛]字符串大师
脑洞题...玄学 假如是a[i]!=i,说明构成了循环节长为a[i]的循环,那就去%一下(别想多)看一下是循环节中的第几个咯. 否则新填的这个不能和前面构成任何循环,那就不停往前跳去把不能填的标记一下 ...
- bzoj 4974: [Lydsy八月月赛]字符串大师
4974: [Lydsy八月月赛]字符串大师 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 371 Solved: 190[Submit][Statu ...
- BZOJ4974 大视野1708月赛 字符串大师
传送门 题目大意 给定一个字符串的每一个前缀的最短循环节长度,求符合要求的字典序最小的字符串. 题解 给定循环节最短长度就是给定了这个字符串$kmp$的$next$数组,即$X_i=i-next_i$ ...
- bzoj4974: [Lydsy八月月赛]字符串大师
传送门 题目可转换为已知一个串kmp之后的nxt数组,求字典序最小的原串. 已知第i位结尾的串循环节长度位x,那么nxt[i]=i-x; 当nxt不为0时,s[i]=s[nxt[i]]; nxt为0时 ...
- 【刷题】BZOJ 4977 [Lydsy1708月赛]跳伞求生
Description 小Q最近沉迷于<跳伞求生>游戏.他组建了一支由n名玩家(包括他自己)组成的战队,编号依次为1到n.这个游 戏中,每局游戏开始时,所有玩家都会从飞机上跳伞,选择一个目 ...
随机推荐
- Mysql 中 int(3) 和 int(11) 的区别
[1]int(3) 和 int(11)的区别(思维惯性认知错误) 这里的3或11代表的是存储在数据库中的具体的长度,总以为int(3)只能存储3个长度的数字,int(11)只会存储11个长度的数字. ...
- 嵌入式02 STM32 实验05 蜂鸣器
蜂鸣器:是一种一体化结构的电子讯响器.主要分为分压式蜂鸣器和电磁式蜂鸣器两种类型. 一.有源/无源蜂鸣器(不是指是否带电源,而是有没有自带震荡电路) 1.有源蜂鸣器:有源蜂鸣器自带震荡电路,一通电就会 ...
- Redis初识01 (简介、安装、使用)
一.Reids介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...
- Bitnami配置域名访问
安装完成Bitnami后,需要执行以下命令将默认目录改为/wordpress: E:\Bitnami\wordpress-5.2.2-0\apps\wordpress\bnconfig.exe --a ...
- 用python读取word文件里的表格信息【华为云技术分享】
在企查查查询企业信息的时候,得到了一些word文件,里面有些控股企业的数据放在表格里,需要我们将其提取出来. word文件看起来很复杂,不方便进行结构化.实际上,一个word文档中大概有这么几种类型的 ...
- redis - redis安装与启动
redis安装 下载redis安装包 wget http://download.redis.io/releases/redis-5.0.7.tar.gz 解压缩 tar -xzf redis-5.0. ...
- nrm的安装和使用
1.安装nodejs,下载地址,http://nodejs.cn/download/,安装过程直接点击下一步即可 安装完成后cmd输入npm -v 查看当前安装的npm的版本,如下图提示所示则表示安装 ...
- VMware 网络介绍
3.1 网卡介绍 如图所示,你的机器有两块网卡,一个是有线,一个是无线. 装完VM之后,会出现两块虚拟网卡,如图 VM有四种连接方式,我们着重介绍前三种 3.2 桥接 选择桥接模式,说明V ...
- 让js中的函数只有一次有效调用
设置隐藏域~ <input type="hidden" value="1" id="flag" /> 其它三种方法
- 获取本机的IP地址和mac地址
1. 以前一直用ipconfig来查看ip地址,哈哈哈,现在发现挺好玩 #获取本机的IP地址和mac地址 import uuid import socket def get_mac_address() ...