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; ...
随机推荐
- 异常类的构建——顶层父类Exception的实现
异常类构建异常的类型可以是自定义类类型对于类类型异常的匹配依旧是从上到下严格的匹配赋值兼容性原则在异常匹配中依然适用一般而言-匹配子类异常的catch放在上部-匹配父类异常的catch放在下部 现代C ...
- acWing 825. 排队购物
题目描述苏西小朋友和她的妈妈正在超市里购物,看着收银处排着的长长的队伍,她就想如何能够提高整体的服务质量呢? 已知,现在有n个人正在排队等待结账,每个人结账所花的时间都可能是不同的,第 i 个人的结账 ...
- AcWing 77. 翻转单词顺序
习题地址 https://www.acwing.com/problem/content/description/73/ 题目描述输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变. 为简单 ...
- Java之Random类
什么是Random类 此类的实例用于生成伪随机数,使用此类中的方法能够得到一个随机数. Random使用步骤 查看类 java.util.Random :该类需要 import导入使后使用. 查看构造 ...
- Codeforces Round #597 (Div. 2) F. Daniel and Spring Cleaning 数位dp
F. Daniel and Spring Cleaning While doing some spring cleaning, Daniel found an old calculator that ...
- 创意编程,Python开发多功能壁纸自动切换工具!
import ctypes import time import requests import os from threading import Thread from tkinter import ...
- css 如何让大小不同的图片表现一致,同时自适应呢?
壹 ❀ 引 实习生在做产品分类页时,遇到了一个她不知道如何解决问题,所以来问我应该怎么做:问题其实不难,由于项目使用了bootstrap来实现响应式与自适应,所以除了宽度有明确的百分比值之外(栅格化 ...
- IT兄弟连 Java语法教程 三目运算符
Java提供了一个特殊的三目(三个分支)运算符,它可以替代特定类型的if-then-else语句结构.这个运算符是“?”乍一看可能有一些困惑,但一旦理解“?”运算符,就可以高效地使用它.“?”运算符的 ...
- OpenGL光照3:光源
本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...
- Docker基础概念与安装
Docker是什么? Docker最初是dotCloud公司的创始人Solomon Hyks在法国期间发起的一个公司内部项目,它是基于dotCloud公司多年云服务技术的一次革新,并于2013年3月以 ...