LG4051/BZOJ1031 「JSOI2007」字符加密 后缀数组
问题描述
题解
发现这是一个环,根据经验,破环为链,于是字符环变为了字符串
之后对这个复制之后的字符串求后缀数组。
$len$代表原字符串长度,代表复制后的字符串长度
最后输出的时候,判断一下,如果$SA_i \le len$,则输出$str_i$。
Code
#include<bits/stdc++.h>
using namespace std; #define maxn 1000007 void read(int &x){
x=;char ch=;int fh;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') fh=-,ch=getchar();
else fh=;
while(ch>=''&&ch<=''){
x=(x<<)+(x<<)+ch-'';
ch=getchar();
}
x*=fh;
} char s[maxn];
int n,m,sa[maxn],x[maxn],y[maxn],ct[maxn]; int chk(int x){
return x>?x:x+n;
} void SA(){
for(register int i=;i<=n;i++) ct[x[i]=s[i]]++;
for(register int i=;i<=m;i++) ct[i]+=ct[i-];
for(register int i=n;i>=;i--) sa[ct[x[i]]--]=i;
for(register int k=;k<=n;k<<=){
int tot=;
for(register int i=n-k+;i<=n;i++) y[++tot]=i;
for(register int i=;i<=n;i++) if(sa[i]>k) y[++tot]=sa[i]-k;
for(register int i=;i<=m;i++) ct[i]=;
for(register int i=;i<=n;i++) ct[x[i]]++;
for(register int i=;i<=m;i++) ct[i]+=ct[i-];
for(register int i=n;i>=;i--) sa[ct[x[y[i]]]--]=y[i],y[i]=;
swap(x,y);x[sa[]]=tot=;
for(register int i=;i<=n;i++)
if(y[sa[i]]==y[sa[i-]]&&y[sa[i]+k]==y[sa[i-]+k]) x[sa[i]]=tot;
else x[sa[i]]=++tot;
if(tot==n) break;
m=tot;
}
} int rnk[maxn];
int let;
int main(){
ios::sync_with_stdio();
cin>>(s+);n=strlen(s+);let=n;
for(register int i=n+;i<=n*;i++) s[i]=s[i-n];
n*=;
m=;SA();
for(register int i=;i<=n;i++){
rnk[sa[i]]=i;
}
for(register int i=;i<=n;i++){
if(sa[i]<=let)
cout<<s[sa[i]+let-];
}
cout<<endl;
return ;
}
LG4051/BZOJ1031 「JSOI2007」字符加密 后缀数组的更多相关文章
- 洛谷P4051 [JSOI2007]字符加密 后缀数组
题目链接:https://www.luogu.org/problemnew/show/P4051 思路:我们联想求后缀数组sa的过程,发现我们在求y数组的时候(第二关键字,下标为第二关键字的排位,值为 ...
- BZOJ.1031.[JSOI2007]字符加密(后缀数组)
题目链接 环可以拆成链:对字符串排序能想到后缀数组. 完了.输出时忽略长度不足n的串,输出s[sa[i]+n-1],即排名为i的字符串的末尾. //4140kb 744ms #include < ...
- [JSOI2007]字符加密 后缀数组
题面:洛谷 题解: 我们考虑,如果可以将环上每个长度为len的串都提取出来,再做个排序,那这题我们就做出来了! 但是提取$n^2$,怎么办? 考虑破环成链,再扩充为原来的2倍. 然后直接做后缀排序,把 ...
- 「HAOI2016」字符合并
「HAOI2016」字符合并 题意: 有一个长度为\(n\)的\(01\)串,你可以每次将相邻的\(k\)个字符合并,得到一个新的字符并获得一定分数.得到的新字符和分数由这\(k\)个字符确定.你 ...
- 【BZOJ4566】找相同字符(后缀数组)
[BZOJ4566]找相同字符(后缀数组) 题面 BZOJ 题解 后缀数组的做法,应该不是很难想 首先看到两个不同的串,当然是接在一起求\(SA,height\) 那么,考虑一下暴力 在两个串各枚举一 ...
- 【BZOJ】【1031】【JSOI2007】字符加密Cipher
后缀数组 当年感觉好神的题现在好像变水了…… 题意其实有点蛋疼……一开始没看懂<_< 将原串复制一遍接在后面,用后缀数组求一下SA,那么SA<n的就是所找到的那n个字符串,然后把它们 ...
- BZOJ4566 [Haoi2016]找相同字符 【后缀数组】
题目 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. 输入格式 两行,两个字符串s1,s2,长度分别为n1,n2.1 & ...
- 【LOJ】#2063. 「HAOI2016」字符合并
题解 dp[i][j][S]表示区间[i,j]内剩余的数位状压后为S的最大值 这样转移起来不就是\(n^3 2^8\)了吗 冷静一下,我们可以发现一段区间内剩下的数位的个数是一定的,也就是我们可以在枚 ...
- loj2063 「HAOI2016」字符合并
ref #include <iostream> #include <cstring> #include <cstdio> using namespace std; ...
随机推荐
- day_92_11_14flask的启动和orm,反向生成model
一.自定义命令. 在flask中也可以将应用改写成可以使用命令的形式,需要用到模块: pip install flask-script 使用关键字manage使得其能使用终端启动: from flas ...
- LeetCode 5126. 有序数组中出现次数超过25%的元素 Element Appearing More Than 25% In Sorted Array
地址 https://leetcode-cn.com/contest/biweekly-contest-15/problems/element-appearing-more-than-25-in-so ...
- Java编译器的2点优化
优化1 对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围,那么javac编译器将会自动隐含地为我们补上一个(byte)(short)(char). 如果没有超过左侧的范围 ...
- jenkins下载插件无插件显示+离线下载插件方法
1.打开Jenkins插件管理,可选插件为空,无法选择自己需要的插件进行下载 打开插件管理的“高级”选项,在升级站点填写 http://mirror.xmission.com/jenkins/upda ...
- seq参数 RANDOM 参数 openssl参数 cut参数
#seq命令用于以指定增量从首数开始打印数字到尾数 语法: [2] seq [选项] 首数 尾数 [3] seq [选项] 首数 增量 尾数选项: seq 实例 一 存入数据库 然后 输出数据库的代码 ...
- C++并发编程实战
第1章 你好,C++并发世界 第2章 管理线程 第3章 在线程间数据共享 第4章 同步并发操作 第5章 C++内存模型和原子类型操作 第6章 设计基于锁的并发数据结构 第7章 设计无锁的并发数据结构 ...
- CF1248E Queue in the Train
题目链接 problem 火车上的一列人要去排队接水.每个人都会在某个特定的时刻口渴.口渴之后他要去排队接水,如果他前面的座位有人已经在排队或者正在接水,那么他就不会去排队.否则他就会去排队.每个人接 ...
- 通过ES6 Module看import和require区别
前言 说到import和require,大家平时开发中一定不少见,尤其是需要前端工程化的项目现在都已经离不开node了,在node环境下这两者都是大量存在的,大体上来说他们都是为了实现JS代码的模块化 ...
- #3146. 「APIO 2019」路灯
#3146. 「APIO 2019」路灯 题目描述 一辆自动驾驶的出租车正在 Innopolis 的街道上行驶.该街道上有 \(n + 1\) 个停车站点,它们将街道划分成了 \(n\) 条路段.每一 ...
- Linux 部署 rabbitMQ集群
1. 部署Erlang 1.1 RabbitMQ依赖于Erlang,版本对应请查看 https://www.rabbitmq.com/which-erlang.html 1.2 下载安装Erlang ...