【模板】BZOJ 1692:队列变换—后缀数组 Suffix Array
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1692
题意:
给出一个长度为N的字符串,每次可以从串头或串尾取一个字符,添加到新串中,使新串的字典序最小。
做法:
经过推导(略),发现只要贪心地取两端字典序较小的一端,所以在一开始对所有的正反后缀排序,即把原串倒过来接在后面求一遍SA就行了。
写了个倍增求SA[]+height[]的板子,代码可能比较长,但相对来说可能容易理解一点...
#include <bits/stdc++.h>
#define TR(x) cout<<#x<<'='<<x<<endl
using namespace std;
typedef long long ll;
const int MAXN=100005;
int M, N, w[MAXN], ht[MAXN], rk[MAXN], sa[MAXN], c[MAXN];
char ch[MAXN], ans[MAXN];
void rsort(int *x, int *y, int up){
for(int i=0; i<up; ++i) c[i]=0;
for(int i=0; i<N; ++i) c[x[i]]++;
for(int i=1; i<up; ++i) c[i]+=c[i-1];
for(int i=N-1; i>=0; --i) sa[--c[x[y[i]]]]=y[i];
}
inline int cmp(int *x, int a, int b, int k){return x[a]==x[b]&&x[a+k]==x[b+k];}
void getsa(){
int *x=ht, *y=rk, up=30;
for(int i=0; i<N; ++i) x[i]=w[i], y[i]=i;
rsort(x,y,up);
for(int k=1, p; p<N; k<<=1, up=p){
p=0;
for(int i=N-k; i<N; ++i) y[p++]=i;
for(int i=0; i<N; ++i) if(sa[i]>=k) y[p++]=sa[i]-k;
rsort(x,y,up); swap(x,y); p=1; x[sa[0]]=0;
for(int i=1; i<N; ++i)
if(cmp(y,sa[i],sa[i-1],k)) x[sa[i]]=p-1;
else x[sa[i]]=p++;
}
for(int i=0; i<N; ++i) rk[sa[i]]=i;
ht[0]=0;
for(int i=0, j, p=0; i<N-1; ++i){
for((p?p--:0),j=sa[rk[i]-1];w[i+p]==w[j+p];++p);
ht[rk[i]]=p-1;
}
}
int main(){
freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
scanf("%d", &M);
for(int i=0; i<M; ++i) getchar(), ch[i]=getchar();
for(int i=0; i<M; ++i) w[M*2-i]=w[i]=ch[i]-'A'+1;
w[M]=27; N=M*2+2;
getsa(); fflush(stdout);
for(int i=0, j=M-1, t=0; i<=j; t++){
if(rk[i]<rk[N-2-j]) ans[t]=ch[i++];
else ans[t]=ch[j--];
}
for(int i=0; i<M; ++i){
putchar(ans[i]);
if((i+1)%80==0) putchar('\n');
}
return 0;
}
【模板】BZOJ 1692:队列变换—后缀数组 Suffix Array的更多相关文章
- 后缀数组(suffix array)
参考: Suffix array - Wiki 后缀数组(suffix array)详解 6.3 Suffix Arrays - 算法红宝书 Suffix Array 后缀数组 基本概念 应用:字 ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 (后缀数组/二分+Hash)
跟BZOJ 4278: [ONTAK2015]Tasowanie一模一样 SA的做法就是把原串倒过来接在原串后面,O(nlogn)O(nlogn)O(nlogn)做后缀数组,就能O(1)O(1)O(1 ...
- 1692: [Usaco2007 Dec]队列变换|后缀数组|贪心
将字符串翻转后接到原串的后面,中间加一个分隔符,每次都贪心选择rankrank小的那个 事实上就是练习一发后缀数组的模板 #include<algorithm> #include<i ...
- 【BZOJ-1692&1640】队列变换 后缀数组 + 贪心
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1153 Solved: 482[Submit][St ...
- 【BZOJ1692】[Usaco2007 Dec]队列变换 后缀数组+贪心
[BZOJ1692][Usaco2007 Dec]队列变换 Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比 ...
- 后缀数组(suffix array)详解
写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...
- 利用后缀数组(suffix array)求最长公共子串(longest common substring)
摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其 ...
- 数据结构之后缀数组suffix array
在字符串处理当中,后缀树和后缀数组都是非常有力的工具,其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料.其实后缀是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多 ...
随机推荐
- BZOJ 1293 生日礼物(尺取法)
把坐标离散化之后就是很普通的尺取法啦. # include <cstdio> # include <cstring> # include <cstdlib> # i ...
- 【bzoj1704】[Usaco2007 Mar]Face The Right Way 自动转身机 贪心
题目描述 农夫约翰有N(1≤N≤5000)只牛站成一排,有一些很乖的牛朝前站着.但是有些不乖的牛却朝后站着.农夫约翰需要让所有的牛都朝前站着.幸运的是约翰最近买了一个自动转身机.这个神奇的机器能使K( ...
- Windows的三种截屏方法
「发表于知乎」戳
- Android 解决setRequestedOrientation之后手机屏幕的旋转不触发onConfigurationChanged方法
最近在做播放器的时候遇到一个问题,在屏幕方向改变之后需要切换播放器全屏/非全屏的时候,在重写了onConfigurationChanged方法并在manifest.xml配置文件中添加 android ...
- mybatis中parameterType可以写的别名
mybatis中parameterType可以写的别名 https://blog.csdn.net/sdzhangshulong/article/details/51749807 _byte byte ...
- 使用springcloud的feign调用服务时出现的错误:关于实体转换成json错误的介绍
http://blog.csdn.net/java_huashan/article/details/46428971 原因:实体中没有添加无参的构造函数 fastjson的解释: http://www ...
- eclipse ----- indexer
使能indexer,可以实现变量.函数等的跳转, 即跳转到定义的位置
- 基于jQuery UI的调色板插件推荐colorpicker
1.下载地址 点击网页最下端Download,即可下载 2.使用方法 本插件是基于jQuery UI,所以应该先行下载jQuery UI,当然jQuery也必不可少 引入和初始化 引入js文件 & ...
- mac之os x系统下搭建nodejs+express4.x+mongodb+gruntjs整套前端工程
第一次在Mac OS X上搭建前端开发环境,做一个小小记录,包括一些与windows系统的区别和常用快捷键 首先,在进行环境搭建之前先来看一下苹果系统的“cmd”,也就是Terminal(终端). 打 ...
- getQueryString----获取url中得参数
/** * 获取url中得参数 * @param name * @returns {null} */ window.getQueryString = function (name) { var reg ...