字符串题

  • 考虑找到一种方法,能够对一个 lyndon 串 A ,直接求出 A 的下一个 lyndon 串。
  • 考虑不断复制 A ,得 AAA…A
  • 因为 lyndon 串是自身循环移位得到的串中字典序严格最小的,所以 AAA…A 非lyndon 串。
  • 考虑微调:将 AAA…A 的末尾稍变大一些。具体方法如下:
    1.若 AAA…A 的最后一位不为 ‘a’+m-1,让 AAA…A 的最后一个字符变为这个字符在字符集中的后继(如a变成b,b变成c)
    2.若 AAA…A 的最后一位为 ‘a’+m-1,删去最后一位,一直删到最后一位不为 ′a′+m−1 为止,然后按1.的情况处理
    (ps.其实就是找字典序比A大一的字符串A’,这样得到的串 AA…AA’ 字典序刚好比 AAA…A 大一)
  • 可以证明 AA…AA’ 为 lyndon 串 :

若循环移位后的串以A开头:
则必有A…AA’A…A>AAA…AA’。

若循环移位后的串不以A开头:
设 A=a1a2⋯a∣A∣A=a_1a_2⋯a_{|A|}A=a1​a2​⋯a∣A∣​ 。
由于 A 为 lyndon 串,所以对 ∀1<i≤∣A∣∀1<i≤|A|∀1<i≤∣A∣ ,有 aiai+1⋯a∣A∣a1a2...ai−1>a1a2⋯a∣A∣a_ia_{i+1}⋯a_{|A|}a_1a_2...a_{i-1}>a_1a_2⋯a_{|A|}ai​ai+1​⋯a∣A∣​a1​a2​...ai−1​>a1​a2​⋯a∣A∣​ 。所以得到的串字典序必大于 AA…AA’

  • 考虑怎么让 AA…AA’ 与 A 之间无其它 lyndon 串:
    设 T 为 A 与 AA…AA’ 之间的一个 lyndon 串。因为 A<T<AA…AA’,所以有T=AA…AT’,其中T’ 的前 |A| 位不等于 A。

若 T 中A循环部分的长度 <= AA…AA’ 中A循环部分的长度:
因为 AA…AT’<AA…AA’,所以 T’<=A ,则以 T′ 开头的循环移位小于等于 T ,与 T 是 lyndon 串矛盾

若 T 中A循环部分的长度 > AA…AA’ 中A循环部分的长度:
必有 A<T<AA…AA’,且根据之前的结论,只要令 T’>A,T 必为 lyndon 串

  • 也就是说我们必须令 T中A循环部分的长度 > AA…AA’ 中A循环部分的长度 的T 不符合条件,即|T|>n
  • 那么 AA…AA’ 必须尽可能地长,我们考虑不断复制 A,然后取 AAA… 的前n位,记为 S,再找到字典序比 S 大一的字符串即可(如上文所述)。
  • 可以证明这样得到的串是符合条件的
    证明
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct Que{int x,id;
}que[200010];
int n,m,q,len;
char ans[200010][31],ch[31];
bool cmp(Que a,Que b){return a.x<b.x;
}
int main(){scanf("%d%d%d",&n,&m,&q);for(int i=1;i<=q;i++){scanf("%d",&que[i].x);que[i].id=i;}sort(que+1,que+q+1,cmp);ch[len=1]='a';int p=1;for(int i=1;i<=q;i++){while(p<que[i].x){for(int j=len+1;j<=n;j++) ch[j]=ch[j-len];len=n;while(ch[len]=='a'+m-1) ch[len--]=0;ch[len]++;p++;            }for(int j=1;j<=len;j++) ans[que[i].id][j]=ch[j];}for(int i=1;i<=q;i++){for(int j=1;ans[i][j];j++) putchar(ans[i][j]);puts("");}return 0;
}

[XSY] 字符串题(字符串,构造)相关推荐

  1. 链表,字符串题,模拟与高精度

    文章目录 1.字母转换为大写 4.24 ① 2.小猴记单词 1125 ② 3.花生采摘 4.25 ①删除链表节点 ②删除倒数第n个节点 4.26 ①反转链表 4.27 ①171.转化为26进制,exc ...

  2. N诺刷题——字符串、排序、查找、链表

    字符串类问题 1014加密算法 简单,过 1012字符移动 原做法 借助了两个字符串 #include<iostream> #include <string> #include ...

  3. 华为校招2016.09机试 第2题: 字符串查找

    华为校招2016.09机试 第2题: 字符串查找 描述: 输入两个字符串,查找字符串1中与字符串2最先匹配的内容,将匹配的字符串输出.字符串2支持?通配符,?代表任意一个字符. 已知字符串2不可能出现 ...

  4. C语言课程训练系统题-字符串cqupt

    C语言课程训练系统题-字符串cqupt 1.十进制转换十六进制 2.比较两个字符串的大小 3.输出最长的字符串 4.统计一个字符串在另外一个字符串出现的次数 5.有趣的"回文"检测 ...

  5. 算法题字符串“~asd;4#1ebr67qwe234#13sdBd1d1,@3ret#156ghk123#1A34D”

    算法题字符串"~asd;4#1ebr&67qwe234#1&3sdBd1d1,@3ret#1&56ghk123#1A&34D" 使用3 个线程 a, ...

  6. P3709 大爷的字符串题(莫队+离散)

    大爷的字符串题 题目背景 在那遥远的西南有一所学校, /*被和谐部分*/ 然后去参加该省省选虐场, 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串 a a a,每次询问一段区间的 ...

  7. Java获取相同字符串算法题,数据结构与算法专题——第四题 字符串相似度

    这篇我们看看 最长公共子序列 的另一个版本,求字符串相似度(编辑距离),我也说过了,这是一个非常实用的算法,在DNA对比,网页聚类等方面都有用武之地. 一:概念 对于两个字符串 A 和 B,通过基本的 ...

  8. 数据结构与算法专题——第四题 字符串相似度

    这篇我们看看 最长公共子序列 的另一个版本,求字符串相似度(编辑距离),我也说过了,这是一个非常实用的算法,在DNA对比,网页聚类等方面都有用武之地. 一:概念 对于两个字符串 A 和 B,通过基本的 ...

  9. [字符串题-java实现]LeetCode551. 学生出勤记录 I

    目录 题目要求 代码实现1 代码分析1 1.indexOf(String str) 2.lastIndexOf(String str) 3.contains(CharSequence s) 代码实现2 ...

最新文章

  1. 虚拟化,可实现国产化替代
  2. 从源码理解ReentrantLock
  3. websocket 历史及使用详解
  4. rest_framework06:自动生成路由\action使用\认证
  5. leetcode1045. 买下所有产品的客户(SQL)
  6. Jmeter Beanshell采样器调用JAVA方法(二)
  7. 修改lgoin,http://www.tuicool.com/articles/U3iyqq
  8. VBA实战技巧精粹013:宏代码保存工作簿的3种方法
  9. 安卓系统修改开机LOGO
  10. matlab中一个显示根号的技巧
  11. 毕业论文排版(六)-三线表
  12. CSS背景颜色之奇技淫巧
  13. 你知道你的手机上有哪些传感器吗?
  14. python 猿编程模块(一)ybc_speech
  15. 【大数据千人会微信群20140827期交流纪要】傅志华-大数据如何在企业落地
  16. 加速度中的mg/LSB是什么意思
  17. PhotoShop算法实现进阶-浮雕滤镜-灰度浮雕(三十一)
  18. 阿尔法元秒杀阿法狗,人工智能时代开启了吗
  19. 基于安卓的 gps定位系统的跑步健身助手
  20. SpringCloud之消息总线组件及微服务网关

热门文章

  1. windows制作定时关机脚本_自动关机、自动打开程序… 让Windows自动执行任何操作...
  2. jsp需要多少java基础_Java基础——JSP(一)
  3. 能源36号文解读_IDC报告预测:今年中国新能源汽车销量将达116万辆,未来五年复合增长率36%_详细解读_最新资讯_热点事件...
  4. [JavaWeb-MySQL]约束(非空约束,唯一约束,主键约束,外键约束_级联操作)
  5. 假设一动态集合S用一个长度为m的直接寻址表T来表示。请给出一个查找S中最大元素的过程。(算法导论第十一章11.1-1)
  6. Seek the Name, Seek the Fame POJ - 2752 (理解KMP函数的失配)既是S的前缀又是S的后缀的子串
  7. 第二个一千行总结-数据结构C复习--知识点总结2--五到七章
  8. hdu4609 3-idiots
  9. P2522 [HAOI2011]Problem b
  10. 牛客题霸 [合并二叉树] C++题解/答案