【思维题 kmp 构造】bzoj4974: [Lydsy1708月赛]字符串大师
字符串思博题这一块还是有点薄弱啊。
Description
Input
Output
Sample Input
1 2 2 2 5
Sample Output
题目分析
暴力dfs
好吧考试时候暴力还是要保证写得又快又不挂的
时间复杂度$O(26^n)$。但是这个上界非常松,我不知道怎样是紧一点的下界。
暴力枚举
因为一定有解,那么每一个位置都枚举一种颜色看一看是否合法。
时间复杂度$n^2$。但是好像实际效率和dfs差了多少。
kmp
从枚举的思路顺着下去,算法的瓶颈在于找到一个最小的合法当前颜色。
我们知道如果存在最小循环节,那么其长度为$i-fail[i]$。于是从问题反面来看,只需要找到当前位置所有不可能的颜色,剩下的最小颜色就是其答案。那么求这个反面就相当于找$i$位置对应的所有合法的最小循环节。
所以,在这颗抽象的fail树上向前跳就可以得到答案。

还有一个处理的细节,就是$'a'$的特判。注意到$'a'$只会出现在$a[i]!=i(i!=1)$的位置。所以对于$a[i]==i$的位置,是不可能为$'a'$的,那么这里枚举答案时就要从$'b'$开始。
#include<bits/stdc++.h>
const int maxn = 100035; bool vis[31];
int n,a[maxn],t[maxn]; int read()
{
char ch = getchar();
int num = 0;
for (; !isdigit(ch); ch=getchar());
for (; isdigit(ch); ch=getchar())
num = (num<<1)+(num<<3)+ch-48;
return num;
}
int main()
{
freopen("string.in","r",stdin);
freopen("string.out","w",stdout);
n = read();
for (int i=1; i<=n; i++) a[i] = read();
for (int i=2; i<=n; i++)
{
if (a[i]!=i) t[i] = t[(i-1)%a[i]+1];
else{
memset(vis, 0, sizeof vis);
int j = i-1;
while (j!=a[j])
j = (j-1)%a[j]+1, vis[t[j+1]] = 1;
for (int k=1; k<26; k++)
if (!vis[k]){
t[i] = k;
break;
}
}
}
for (int i=1; i<=n; i++) putchar(t[i]+'a');
return 0;
}
END
【思维题 kmp 构造】bzoj4974: [Lydsy1708月赛]字符串大师的更多相关文章
- 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]=j ...
- bzoj4974: [Lydsy1708月赛]字符串大师
脑洞题...玄学 假如是a[i]!=i,说明构成了循环节长为a[i]的循环,那就去%一下(别想多)看一下是循环节中的第几个咯. 否则新填的这个不能和前面构成任何循环,那就不停往前跳去把不能填的标记一下 ...
- BZOJ4974:[Lydsy1708月赛]字符串大师(逆模拟KMP)
题目描述 一个串T是S的循环节,当且仅当存在正整数k,使得S是T k Tk (即T重复k次)的前缀,比如abcd是abcdabcdab的循环节.给定一个长度为n的仅由小写字符构成的字符串S,请对于每 ...
- bzoj 4974 [Lydsy1708月赛]字符串大师 KMP 最小循环元 构造
LINK:字符串大师 给出一个字符串的每个前缀的最小循环元 还原字典序最小的原字符串. 一个比较显然的结论 或者说 学过KMP的都知道 对于每个前缀i求出nex数组后 那么i-nex[i]为最小循环元 ...
- BZOJ4974:[lydsy1708月赛]字符串大师
浅谈\(KMP\):https://www.cnblogs.com/AKMer/p/10438148.html 题目传送门:https://lydsy.com/JudgeOnline/problem. ...
- 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$ ...
- 【刷题】BZOJ 4977 [Lydsy1708月赛]跳伞求生
Description 小Q最近沉迷于<跳伞求生>游戏.他组建了一支由n名玩家(包括他自己)组成的战队,编号依次为1到n.这个游 戏中,每局游戏开始时,所有玩家都会从飞机上跳伞,选择一个目 ...
- bzoj4974: [Lydsy八月月赛]字符串大师
传送门 题目可转换为已知一个串kmp之后的nxt数组,求字典序最小的原串. 已知第i位结尾的串循环节长度位x,那么nxt[i]=i-x; 当nxt不为0时,s[i]=s[nxt[i]]; nxt为0时 ...
随机推荐
- Luogu P1558 色板游戏【线段树/状态压缩】By cellur925
题目传送门 今天非常想再看一遍霸王别姬想不进去题于是开始刷数据结构 注意到至多只有\(30\)种颜色,啊啊啊啊我一开始竟然想的不是状态压缩而是在线段树中存一个30大小的数组,这样每次更新的时候暴力循环 ...
- Kaggle 数据挖掘比赛经验分享
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 腾讯广告算法大赛 作者 | 陈成龙 Kaggle 于 2010 年创立,专注数据科学,机器学 ...
- Java使用FFmpeg处理视频文件的方法教程
这篇文章主要给大家介绍了关于Java使用FFmpeg处理视频文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前言 本文主要 ...
- bzoj3295: [Cqoi2011]动态逆序对 三维数点
为了便于考虑,把删除反序变为增加 于是就变成关于权值和位置和时间的三维数点 一波cdq一波树状数组教做人 (神TM需要longlong,80了一发) #include <bits/stdc++. ...
- Rebus消息总线
这里主要讲一下我基于Rebus写的一个ABP框架的模块 目录结构 对于Rebus网上的资料很少,其实我对于服务总线也不是很理解 ..个人理解的就是像ABP中的EventBus那样的,但是集成了一些 ...
- NET Core中使用Redis和Memcached
.NET Core中使用Redis和Memcached的序列化问题 前言 在使用分布式缓存的时候,都不可避免的要做这样一步操作,将数据序列化后再存储到缓存中去. 序列化这一操作,或许是显式的,或许 ...
- IIS访问网站出错[要求输入用户名密码]的解决方案
症状: 1.HTTP 500 - 内部服务器错误 2.您不具备使用所提供的凭据查看该目录或页的权限 3.基于所提供的凭据,您没有权限查看此目录或网页.HTTP 错误 401.3 - 访问被资源 ACL ...
- undefined is not a function
具体报错 TypeError: c:\Users\Administrator\WebstormProjects\blogtest\views\index.ejs:1 >> 1| <% ...
- node-amqp 使用fanout发布订阅rabbitmq消息
publisher代码 const amqp = require('amqp'); let option = { host: 'server-ip', port: 5672, login: 'gues ...
- 基于JavaMail的Java邮件发送:复杂邮件发送
参考:http://blog.csdn.net/xietansheng/article/details/51722660package com.bfd.ftp.utils;import java.ut ...