【题解】[JSOI2007]字符加密
\(\text{Solution:}\)
后缀数组第一题祭……
观察一下,这个是让求一个环形的原字符串的后缀,我们可以考虑一下断环为链。
对于\(aba\)我们扩展成\(abaaba,\)则一个后缀\(baa\)对应的就是\(baaba,aba\)对应的就是\(abaaba\).
那么,两个扩展后的后缀如果要比大小,则要从前向后一个个比较。也就是说,对于原来环形串上的段,它们的排名其实是不变的。因为前一段包括这一段的部分是不变的,又因为它从前向后比较,所以相对排名不变。
那么,我们将原串扩展为两倍后,进行后缀排序。
对于已经知道的\(sa[i]\)我们从小到大枚举\(i\)(根据题意,排名从小到大),并且判断这个起点是不是可以包含一段对应的后缀。如果包含,我们就把它对应的那一段的最后一个字符输出即可。
后缀数组我们可以做到\(O(n\log n).\)
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e6+10;
char s[MAXN];
int rk[MAXN],sa[MAXN],o[MAXN<<1],n,m=200,px[MAXN],cnt[MAXN],id[MAXN];
inline bool cmp(int x,int y,int w){return o[x]==o[y]&&o[x+w]==o[y+w];}
#define D cout<<"qwq\n";
int main(){
cin>>(s+1);
n=strlen(s+1)<<1;
//D
for(int i=1;i<=(n/2);++i)s[i+(n/2)]=s[i];
// for(int i=1;i<=n;++i)cout<<s[i];
// cout<<endl;
for(int i=1;i<=n;++i)++cnt[rk[i]=s[i]];
for(int i=1;i<=m;++i)cnt[i]+=cnt[i-1];
for(int i=n;i>=1;--i)sa[cnt[rk[i]]--]=i;
int p,w;
//D
for(w=1;w<=n;w<<=1,m=p){
p=0;
for(int i=n;i>n-w;--i)id[++p]=i;
for(int i=1;i<=n;++i)if(sa[i]>w)id[++p]=sa[i]-w;
fill(cnt,cnt+m+1,0);
for(int i=1;i<=n;++i)++cnt[px[i]=rk[id[i]]];
for(int i=1;i<=m;++i)cnt[i]+=cnt[i-1];
for(int i=n;i>=1;--i)sa[cnt[px[i]]--]=id[i];
memcpy(o,rk,sizeof(rk));p=0;
for(int i=1;i<=n;++i)rk[sa[i]]=cmp(sa[i],sa[i-1],w)?p:++p;
if(m==n)break;
//D
}
// for(int i=1;i<=n;++i)cout<<sa[i]<<" ";
// cout<<endl;
for(int i=1;i<=n;++i){
if(sa[i]<=n/2)cout<<s[sa[i]+n/2-1];
}
//JSOI07JSOI07
return 0;
}
【题解】[JSOI2007]字符加密的更多相关文章
- BZOJ 1031: [JSOI2007]字符加密Cipher 后缀数组
1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6014 Solved: 2503[Submit ...
- 【BZOJ1031】[JSOI2007]字符加密Cipher 后缀数组
[BZOJ1031][JSOI2007]字符加密Cipher Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的 ...
- [JSOI2007]字符加密Cipher SA
[JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7859 Solved: 3410[Submit][Stat ...
- bzoj 1031: [JSOI2007]字符加密Cipher 後綴數組模板題
1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3157 Solved: 1233[Submit ...
- 1031: [JSOI2007]字符加密Cipher
1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7338 Solved: 3182[Submit ...
- BZOJ_1031_[JSOI2007]字符加密Cipher_后缀数组
BZOJ_1031_[JSOI2007]字符加密Cipher_后缀数组 Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把 ...
- BZOJ 1031 [JSOI2007]字符加密Cipher 后缀数组教程
1031: [JSOI2007]字符加密Cipher Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一 ...
- BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题
BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题 将字符串复制一遍接在原串后面,然后后缀排序即可. #include <cmath> #include &l ...
- P4051 [JSOI2007]字符加密 解题报告
P4051 [JSOI2007]字符加密 题目描述 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不 ...
- [JSOI2007]字符加密Cipher
bzoj 1031:[JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MB Description 喜欢钻研问题的JS同学,最近又迷 ...
随机推荐
- 【Pytorch-入门】windows下的环境搭建(经验证成功~)
前言 实验需要,之前使的tensorflow[因为自己手边的服务器都是windows环境TT...],但身边的师兄们用的都是pytorch,自己查了查现在做科研基本上都是用的pytorch,而且现在p ...
- Fitness - 05.06
倒计时239天 运动31分钟,共计10组,3.2公里.拉伸10分钟. 每组跑步1分钟(6.4KM/h),走路2分钟(5.8KM/h). 每组跑步1分钟的锻炼和上次比起来略显轻松,因此本次锻炼的目的主要 ...
- rpc中的高并发
手写一个高性能的rpc框架 模拟服务端,运行main函数,相当于启动服务器 public class ServerApplication { public static void main(Strin ...
- MySQL 日期时间类型怎么选?千万不要乱用!
构建数据库写程序避免不了使用日期和时间,对于数据库来说,有多种日期时间字段可供选择,如 timestamp 和 datetime 以及使用 int 来存储 unix timestamp. 不仅新手,包 ...
- 小程序开发-使用npm包
微信小程序引用npm包 微信小程序官方支持使用npm包,地址为 https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html 实 ...
- 在微信公众号"码海"里学了一招:在update语句里使用case when 以避免多次更新导致的数据异常.
需求:将emp表中工资大于一万的降到9成,工资少于一万的乘以1.2. 难点:如果分成两句update执行,在10000附近的值可能会执行两次. 钥匙:在update语句里采用case when,使更新 ...
- leetcode刷题-51N皇后
题目 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案. 每一种解法包含一个明确的 n 皇后问 ...
- pwnable.kr之bof
打开题目: 先下载题目给我们的两个文件,查看文件信息: 发现没有执行的权限,所以先增加文件bof的执行权限,执行: 没发现啥,然后查看代码, #include <stdio.h> #inc ...
- pyhton:time模块和datetime模块
一.time模块 1.相关定义: time模块时间的表达有3种,时间戳,时间元祖,格式化时间 #时间戳: print(time.time())#获取当前时间戳.时间戳的计算是1970纪元后经过的浮点秒 ...
- JZOJ1495 宝石
Description 见上帝动了恻隐之心,天后也想显示一下慈悲之怀,随即从口袋中取出一块魔术方巾,让身边的美神维纳斯拿到后堂的屏风上去试试,屏风是正方形的,高和宽方向上各划有m条鱼屏风的边平行的直线 ...