【模板】BZOJ 1692:队列变换—后缀数组 Suffix Array

时间:2022-04-19 08:51:01

传送门: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的更多相关文章

  1. 后缀数组&lpar;suffix array&rpar;

    参考: Suffix array - Wiki 后缀数组(suffix array)详解 6.3   Suffix Arrays - 算法红宝书 Suffix Array 后缀数组 基本概念 应用:字 ...

  2. BZOJ 1692&colon; &lbrack;Usaco2007 Dec&rsqb;队列变换 &lbrack;后缀数组 贪心&rsqb;

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

  3. BZOJ 1692&colon; &lbrack;Usaco2007 Dec&rsqb;队列变换 &lpar;后缀数组&sol;二分&plus;Hash&rpar;

    跟BZOJ 4278: [ONTAK2015]Tasowanie一模一样 SA的做法就是把原串倒过来接在原串后面,O(nlogn)O(nlogn)O(nlogn)做后缀数组,就能O(1)O(1)O(1 ...

  4. 1692&colon; &lbrack;Usaco2007 Dec&rsqb;队列变换&vert;后缀数组&vert;贪心

    将字符串翻转后接到原串的后面,中间加一个分隔符,每次都贪心选择rankrank小的那个 事实上就是练习一发后缀数组的模板 #include<algorithm> #include<i ...

  5. 【BZOJ-1692&amp&semi;1640】队列变换 后缀数组 &plus; 贪心

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1153  Solved: 482[Submit][St ...

  6. 【BZOJ1692】&lbrack;Usaco2007 Dec&rsqb;队列变换 后缀数组&plus;贪心

    [BZOJ1692][Usaco2007 Dec]队列变换 Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比 ...

  7. 后缀数组&lpar;suffix array&rpar;详解

    写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...

  8. 利用后缀数组&lpar;suffix array&rpar;求最长公共子串&lpar;longest common substring&rpar;

    摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其 ...

  9. 数据结构之后缀数组suffix array

    在字符串处理当中,后缀树和后缀数组都是非常有力的工具,其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料.其实后缀是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多 ...

随机推荐

  1. Mac下git命令自动补全

    当我第一次在mac上安装git,[tab]补全装成功了,但是我没有记录,当我过一段时间在重装的时候,我已经忘记了,又是各种查资料,再次做一下简单的记录. 首先,我因为还是mac小白,所以使用Homeb ...

  2. QThread 与 QObject的关系

    Threads and QObjects QThread 继承 QObject..它可以发送started和finished信号,也提供了一些slot函数. QObject.可以用于多线程,可以发送信 ...

  3. &lbrack;转&rsqb;SAP中找表的方法

    http://blog.chinaunix.net/uid-24063584-id-2642334.html 分类: 18种根据屏幕字段查找数据库表数据的技巧 帮助   18种根据屏幕字段查找潜在数据 ...

  4. windows azure Vm、cloud service、web application 如何选择可用的服务

    windows azure 的web应用和虚拟机都经常用.我们经常把我们的网站部署上去.一般选择web应用或者开一个虚拟机.开一个虚拟机就会按照虚拟机的使用时间进行计费. 那么我们选择web部署在哪里 ...

  5. 【完全背包】HDU 1284 钱币兑换问题

    Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. Input 每行只有一个正整数N,N小于32768. Out ...

  6. ipa 注入 dylib

    前些日子再github找到了一个内存修改器 DLGMemor 免越狱在app内植入修改器,感觉很不错,就尝试去看看是否可行. 用到的工具:  Xcode 10. optool 首先要做的,安装 opt ...

  7. 百度地图足迹demo(多点轨迹生成)

    不要忘记引用JQuery//~~~<script src="jquery-1.7.1.min.js" type="text/javascript"> ...

  8. DPDK flow&lowbar;filtering 源码阅读

    代码部分 main.c /*- * BSD LICENSE * * Copyright 2017 Mellanox. * * Redistribution and use in source and ...

  9. 【BZOJ3105】【CQOI2013】新Nim游戏

    Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴 ...

  10. 【记录】尝试用QEMU模拟ARM开发板去加载并运行Uboot,kernel,rootfs【转】

    转自:https://www.crifan.com/try_use_qemu_emulate_arm_board_to_load_and_run_uboot_kernel_rootfs/ [背景] 手 ...