显然最短循环节长度=i-next[i],则相当于给定next数组构造字符串。然后按照kmp的过程模拟即可。虽然这看起来是一个染色问题,但是由图的特殊性,如果next=0只要贪心地选最小的就可以了,稍微想一下容易证明。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cassert>
using namespace std;
#define ll long long
#define N 100010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int n,nxt[N];
bool flag[26];
char s[N];
int main()
{
#ifndef ONLINE_JUDGEfreopen("bzoj4974.in","r",stdin);freopen("bzoj4974.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifn=read();for (int i=1;i<=n;i++) nxt[i]=i-read();nxt[0]=-1;for (int i=1;i<=n;i++){int j=nxt[i-1];memset(flag,0,sizeof(flag));while (~j&&j+1!=nxt[i]) flag[s[j+1]-'a']=1,j=nxt[j];if (j==-1) {for (int j=0;j<26;j++) if (!flag[j]) {s[i]=j+'a';break;}}else s[i]=s[j+1];}printf("%s",s+1);return 0;
}

转载于:https://www.cnblogs.com/Gloid/p/10054430.html

BZOJ4974 字符串大师(kmp)相关推荐

  1. bzoj4974 字符串大师

    4974: 字符串大师 Time Limit: 1 Sec  Memory Limit: 256 MB Submit: 310  Solved: 155 [Submit][Status][Discus ...

  2. 【bzoj4974】字符串大师 逆模拟KMP

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

  3. bzoj-4974 [Lydsy1708月赛]字符串大师

    4974: [Lydsy1708月赛]字符串大师 题目链接 Time Limit: 1 Sec Memory Limit: 256 MB Submit: 721 Solved: 347 [Submit ...

  4. BZOJ 4974: 字符串大师

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

  5. js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个!

    不瞒你说,重复子串问题,KMP很拿手 题目459.重复的子字符串 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: ...

  6. 【2023王道数据结构】【字符串匹配算法】字符串的KMP(next数组)模式匹配算法C、C++完整实现(可直接运行)

    ~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌ ✌ 题目及题解持续更新中 [2023王道数据结构目录]课后算法设计题C.C++代码实现完整版大全 题目: 字符串的KMP(next)模式匹配算 ...

  7. 【GO语言实现字符串匹配算法-KMP算法】

    [GO语言实现字符串匹配算法-KMP算法] KMP算法原理说明: KMP算法是一种改进的字符串匹配算法,是有D.E.Knuth,J.H.Morris和V.R.Pratt提出的,所以被称为KMP算法. ...

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

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

  9. 0x15.基本数据结构 — 字符串 (KMP算法(含详细证明)和最小表示法)

    目录 一.KMP模式匹配 1.引理: 2.引理证明: 3.使用优化的算法计算nextnextnext数组: 4.luogu P3375 [模板]KMP字符串匹配 5.UVA1328 Period 6. ...

最新文章

  1. Nginx使用uninx socket来连接fastcgi(php)
  2. 剖析数组名、函数名(不是指针常量,更不是指针)
  3. 磁盘阵列怎么做_设计与后期制作该怎么选择笔记本电脑?朋克老师来教你
  4. 解决TeXstudio外部查看器失败方法
  5. Ubuntu 18.04 修复 Linux 内核的 11 个漏洞
  6. linux生成大文件
  7. 5个数中取三个数组合 不重复 php,PHP产生不重复随机数的5个方法总结
  8. [转]亚稳态和毛刺 - Metastability and Hazard(CN)
  9. mysql 特殊函数_mysql 的特殊函数
  10. paip.验证码识别---初始化
  11. 模糊C均值聚类算法及实现
  12. 【第一阶段 day25 面向对象】 多态
  13. 7-2 学生成绩排序 (15 分)
  14. 冬季下肢静脉曲张如何治疗
  15. 计算机中桌面位置更改,电脑默认桌面文件夹位置修改不了怎么办
  16. 两位数码管秒表c语言,单片机C语言编程实现双数码管可调秒表
  17. 通过FAR计算fRR
  18. 文本相关_SAP刘梦_新浪博客
  19. 想学温州蛮话?我教你..
  20. JavaScript资源大全中文版(Awesome最新版--转载自张果老师博客)

热门文章

  1. 【路由交换实验】OSPF
  2. IO多路复用之select篇
  3. C/C++中 static 的作用
  4. Head First JSP---随笔六
  5. STM32F4 HAL库开发 -- 复用功能外设
  6. windows下部署oracle11,windows下配置oracle11g的dataguard
  7. 字节(byte)简介
  8. 【Bit-Z新起点,坚守与突破】
  9. Guide To Using The Gnosis Multisig Wallet
  10. Android中的人脸检测入门