洛谷$P5329\ [SNOI2019]$字符串 字符串
正解:字符串
解题报告:
有两个很妙的方法,分别港下$QwQ$
首先为了表示方便,这里和题面一样设$s_i$表示去掉第$i$个字母得到的字符串.另设$lcp(i,j)$表示$suf_i,suf_j$的最长公共前缀
考虑现在如果要比较$s_i$和$s_j$.不妨设$i<j$
首先显然的是$i$之前和$j$之后的字符串都是一样的,于是现在就只要比较$[i,j]$这一段了.
考虑先求出$lcp(i,i+1)$,若$lcp(i,i+1)$的前缀长度大于等于$[i,j]$这一段的长度了,就说明两个字符串相等.
否则就比较$i+lcp(i,i+1)$和$i+1+lcp(i,i+1)$的大小就成.
于是就魔改下$cmp$直接$sort$就成$QwQ$
法二直接一个个考虑.
先从相邻字母不相同的部分分开始想趴$QwQ$.从$s_1$开始考虑,发现$s_1$和其他字母的首位一定不同,所以$s_1$一定要么放开头要么放末尾,放好之后考虑$s_2$,发现是一样的,于是一直这么做下去就完事$QwQ$
欧克现在考虑相邻字母相同?发现如果相邻字母相同也就说这两个删去的效果是一样的,于是考虑缩点($bushi$,把相邻相同的字母删去,就变成了上一个问题,排好序后把缩起来的放回来就好$QwQ$.
这样就可以直接$O(n)$把这题做掉了$QwQ$
$over$
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=1e6+;
int n,len,rl[N];
char str[N]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
void dfs(ri nw)
{
if(nw==len){rp(i,rl[nw],n)printf("%d ",i);return;}
if(str[rl[nw]]<str[rl[nw+]]){dfs(nw+);rp(i,rl[nw],rl[nw+]-)printf("%d ",i);return;}
rp(i,rl[nw],rl[nw+]-)printf("%d ",i);dfs(nw+);
} int main()
{
//freopen("5329.in","r",stdin);freopen("5329.out","w",stdout);
n=read();scanf("%s",str+);rl[++len]=;rp(i,,n)if(str[i]!=str[i-])rl[++len]=i;dfs();
return ;
}
洛谷$P5329\ [SNOI2019]$字符串 字符串的更多相关文章
- c/c++ 数字转成字符串, 字符串转成数字
c/c++ 数字转成字符串, 字符串转成数字 ------转帖 数字转字符串: 用C++的streanstream: #include <sstream> #Include <str ...
- jackson工具类 对象转字符串 -- 字符串转对象
这个一个json的工具类.用的是jackson,当然还有谷歌的gosn,阿里的fastjson ,但是jackson的感觉还是最成熟(网上大神说的...) 实现的功能很简单,对象转字符串 字符串转简 ...
- 2016/4/5 Ajax ①用户名 密码 登陆 注册 ② 判断用户名是否已存在 ③点击按钮出现民族选项下拉菜单 ④DBDA类 加入Ajaxquery方法 数组变字符串 字符串拆分
①登陆 注册 查表匹配 0405Ajax.php ②判断用户名是否存在 <!DOCTYPE html> <html lang="en"> ...
- Java自学-数字与字符串 字符串
Java中的字符串String 示例 1 : 创建字符串 字符串即字符的组合,在Java中,字符串是一个类,所以我们见到的字符串都是对象 常见创建字符串手段: 每当有一个字面值出现的时候,虚拟机就会创 ...
- [洛谷P5329][SNOI2019]字符串
题目大意:给一个长度为$n$的字符串$s$,字符串$p_i$为字符串$s$去掉第$i$个字符后形成的字符串.请给所有字符串$p_i$排序(相同字符串按编号排序) 题解:先去掉所有连续相同字符,因为它们 ...
- BZOJ1856或洛谷1641 [SCOI2010]生成字符串
BZOJ原题链接 洛谷原题链接 可以将\(1\)和\(0\)的个数和看成是\(x\)轴坐标,个数差看成\(y\)轴坐标. 向右上角走,即\(x\)轴坐标\(+1\),\(y\)轴坐标\(+1\),表示 ...
- 卡特兰数 洛谷P1641 [SCOI2010]生成字符串
卡特兰数 参考博客 介绍 卡特兰数为组合数学中的一种特殊数列,用于解决一类特殊问题 设\(f(n)\)为卡特兰数的第n项 其通项公式为 \[f(n)=\frac{2n\choose n}{n+1} \ ...
- 洛谷 P3989 [SHOI2013]阶乘字符串 解题报告
P3989 [SHOI2013]阶乘字符串 题目描述 给定一个由前\(n(\le 26)\)个小写字母组成的串\(S(|S|\le 450)\).串\(S\)是阶乘字符串当且仅当前 \(n\) 个小写 ...
- 洛谷P3952 时间复杂度【字符串】【模拟】
题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...
随机推荐
- js+canvas制作前端验证码
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- git学习一——Pro-Git
1.配置用户名,邮箱 git config --global user.name "Mike" git config --global user.email Mike@exampl ...
- [***]HZOJ 跳房子
一道非常神仙的题. 算法一:对于20%的数据: 模拟,直接走K步,时间复杂度O(K) 算法二:对于40%的数据:走M*N步内必有一个循环节.直接走,找循环节,时间复杂度O(M*N) 正解大概有两种做法 ...
- Getting started with the basics of programming exercises_5
1.编写函数,把由十六进制数字组成的字符串转换为对应的整型值 编写函数htoi(s),把由十六进制数字组成的字符串(包含可选的前缀0x或0X)转换为与之等价的整型值.字符串中允许包含的数字包括:0~9 ...
- @noi.ac - 441@ 你天天努力
目录 @description@ @solution@ @accepted code@ @details@ @description@ 你天天努力,还是比不上小牛,因为小牛在家中套路.于是你决定去拜访 ...
- autocomplete="off" inpu属性
input 的属性autocomplete 默认为on 其含义代表是否让浏览器自动记录之前输入的值 很多时候,需要对客户的资料进行保密,防止浏览器软件或者恶意插件获取到 可以在input中加入auto ...
- 使用FormData格式上传图像并预览图片
前言 做项目时,遇到表单中图像需要跟表单一起提交,这样会造成后台没办法接收到图片.后面上网调查后,明白表单提交时是默认application/x-www-form-urlencoded格式,只接受键值 ...
- 2018-8-10-git-使用-VisualStudio-比较分支更改
title author date CreateTime categories git 使用 VisualStudio 比较分支更改 lindexi 2018-08-10 19:16:52 +0800 ...
- 请求(RequestInfo)
请求类型 StringRequestInfo 用在 SuperSocket 命令行协议中. 你也可以根据你的应用程序的需要来定义你自己的请求类型. 例如, 如果所有请求都包含 DeviceID 信息, ...
- 解决TortoiseSVN中out of date问题的一个方法
http://blog.csdn.net/freefalcon/article/details/645058 从去年开始,公司的代码管理从CVS转向了subvsersion,后者确实是前者的一个飞跃, ...