浅谈\(KMP\):https://www.cnblogs.com/AKMer/p/10438148.html

题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=4974

首先\(per_i=i-nxt_i\),然后我们可以根据\(per_i\)求出\(nxt_i\)。

其次,我们再进行一遍求\(nxt\)的过程,一位一位的确定这个字符串。

因为\([1,i-1]\)都已经确定了,所以根据\(nxt_i\)我可以知道第\(i\)位与哪些位失配了,并且最后是否与某一位匹配上了。

如果与某一位匹配上了,那就直接赋值就行。否则就在失配的字符之外找字典序最小的填到第\(i\)位。

时间复杂度:\(O(n)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <cstring>
using namespace std; const int maxn=1e6+5; int n;
bool bo[26];
char s[maxn];
int nxt[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} int main() {
n=read();s[1]='a';
for(int i=1;i<=n;i++)
nxt[i]=i-read();
for(int j=0,i=2;i<=n;i++) {
memset(bo,0,sizeof(bo));
while(j&&j>nxt[i])bo[s[j+1]-'a']=1,j=nxt[j];
if(j+1==nxt[i])j++;else bo[s[j+1]-'a']=1;
if(j)s[i]=s[j];
else {
for(int k=0;k<26;k++)
if(!bo[k]) {s[i]='a'+k;break;}
}
}
printf("%s",s+1);
return 0;
}

BZOJ4974:[lydsy1708月赛]字符串大师的更多相关文章

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

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

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

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

  3. 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 ...

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

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

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

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

    4974: [Lydsy1708月赛]字符串大师 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 739  Solved: 358[Submit][Sta ...

随机推荐

  1. 奇怪的表达式求值 (java实现)

    题目参考:http://blog.csdn.net/fuxuemingzhu/article/details/68484749 问题描述; 题目描述: 常规的表达式求值,我们都会根据计算的优先级来计算 ...

  2. HDU 4274 Spy's Work (树形DP)

    题意 给定一棵树,给出一些子树的权值关系,问是否矛盾(初始所有结点的下限为1) 思路 设lmin和lmax表示题目给定的限制范围,默认为[1..oo]:amin和amax表示实际符合要求的范围.从根节 ...

  3. mbstring.so下载安装

    linux下安装: $:cd /php7.0/ext/mbstring 切换到源码包目录下 $:/usr/local/php/bin/phpize 执行这句 $:./configure –with-p ...

  4. SpringAnnotation注解之@Autowired

    @Autowired:自动装配,不用在bean里写<property>属性来指定所依赖的属性 1 2 3 4 @Autowired public void setUserDao(UserD ...

  5. 对map参数进行排序

    /**     * Map转换成url参数 by csl     *     * @param map     * @param isSort 是否排序     * @return     */   ...

  6. [转载][QT][SQL]sql学习记录3_sqlite之update delete like

    转载自:详见 : http://www.runoob.com/sqlite/sqlite-create-table.html 约束表实例 下面是一个实例,它创建了一个 COMPANY 表,ID 作为主 ...

  7. 去除inline-block元素间间距的N种方法(转)

    一.现象描述 真正意义上的inline-block水平呈现的元素间,换行显示或空格分隔的情况下会有间距,很简单的个例子: <input /> <input type="su ...

  8. Failed to read schema document

    转自:http://eric-yan.iteye.com/blog/1908470 问题描述: web项目web.xml编译错误: schema_reference.4: Failed to read ...

  9. PHP---文件上传与下载

    转自http://www.cnblogs.com/lazycat-cz/p/4113037.html 安全性能---水平不够 ╮(╯_╰)╭ 文件上传--->就是将本地的文件上传到服务器上.(H ...

  10. UVALive - 4108 SKYLINE (吉司机线段树)

    题目链接 题意:在一条直线上依次建造n座建筑物,每座建筑物建造完成后询问它在多长的部分是最高的. 比较好想的方法是用线段树分别维护每个区间的最小值mi和最大值mx,当建造一座高度为x的建筑物时,若mi ...