考虑第一次切割,必然切割的是翻转后字典序最小的前缀,伪证:

若切割位置更靠前:则会导致第一个数翻转后更靠前,字典序必然更大。

若切割位置更靠后,则显然也会导致字典序更大。

↑,sa即可

对于第二次切割,有结论:将序列分割成两段再分别翻转得到的序列,可以看作是将两个原序列拼接得到的新序列中的某个字串翻转得到的序列。

因此计算新序列的sa,再从中选取字典序最小的合适的后缀即可。

因为要基数排序而又没有告诉权值的范围,因此要离散化。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 400001
struct Point{int p,v;}T[N];
bool operator < (Point a,Point b){return a.v<b.v;}
int s[N],n,rev[N],ma[N],zy;
int t[N],t2[N],sa[N],tong[N];
bool cmp(int *y,int i,int k)
{
return ((y[sa[i-1]]==y[sa[i]])&&((sa[i-1]+k>=n?-1:y[sa[i-1]+k])==(sa[i]+k>=n?-1:y[sa[i]+k])));
}
void build_sa(int s[],int range,int n)
{
int *x=t,*y=t2;
memset(tong,0,sizeof(int)*range);
for(int i=0;i<n;++i) tong[x[i]=s[i]]++;
for(int i=1;i<range;++i) tong[i]+=tong[i-1];
for(int i=n-1;i>=0;--i) sa[--tong[x[i]]]=i;
for(int k=1;k<=n;k<<=1)
{
int 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;
memset(tong,0,sizeof(int)*range);
for(int i=0;i<n;++i) tong[x[y[i]]]++;
for(int i=1;i<range;++i) tong[i]+=tong[i-1];
for(int i=n-1;i>=0;--i) sa[--tong[x[y[i]]]]=y[i];
swap(x,y); p=1; x[sa[0]]=0;
for(int i=1;i<n;++i) x[sa[i]]=cmp(y,i,k)?p-1:p++;
if(p>=n) break;
range=p;
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%d",&T[i].v);
T[i].p=i;
}
sort(T,T+n);
ma[zy++]=T[0].v;
for(int i=1;i<n;++i)
{
if(T[i].v!=T[i-1].v) ++zy;
s[T[i].p]=zy-1;
ma[zy-1]=T[i].v;
}
reverse_copy(s,s+n,rev);
build_sa(rev,zy,n);
int p1;
for(int i=0;i<n;++i)
{
p1=n-sa[i];//第一段长度
if(sa[i]>=2)
{
for(int j=sa[i];j<n;++j)
printf("%d\n",ma[rev[j]]);
break;
}
}
int n2=n-p1;
reverse_copy(s+p1,s+n,rev);
memcpy(rev+n2,rev,sizeof(int)*n2);
build_sa(rev,zy,n2<<1);
for(int i=0;i<(n2<<1);++i)
if(sa[i]&&sa[i]<n2)
{
for(int j=sa[i];j<sa[i]+n2;++j)
printf("%d\n",ma[rev[j]]);
break;
}
return 0;
}

【后缀数组】poj3581 Sequence的更多相关文章

  1. POJ3581 Sequence —— 后缀数组

    题目链接:https://vjudge.net/problem/POJ-3581 Sequence Time Limit: 5000MS   Memory Limit: 65536K Total Su ...

  2. POJ3581 Sequence(后缀数组)

    题意:给一个串,串的第一个字符比后面的都大,要把它分成三段,然后反转每一段,求能得到的字典序最小的串是什么. 首先,第一段是可以确定的:把原串反转,因为第一个字符是最大的,它是唯一的,不存在反转串的后 ...

  3. POJ 3581 Sequence(后缀数组)

    Description Given a sequence, {A1, A2, ..., An} which is guaranteed A1 > A2, ..., An,  you are to ...

  4. 后缀数组 POJ 3581 Sequence

    题目链接 题意:把n个数字(A1比其他数字都大)的序列分成三段,每段分别反转,问字典序最小的序列. 分析:因为A1比其他数字都大,所以反转后第一段结尾是很大的数,相当是天然的分割线,第一段可以单独考虑 ...

  5. Codeforces VK Cup 2015 A.And Yet Another Bracket Sequence(后缀数组+平衡树+字符串)

    这题做得比较复杂..应该有更好的做法 题目大意: 有一个括号序列,可以对其进行两种操作: ·        向里面加一个括号,可以在开头,在结尾,在两个括号之间加. ·        对当前括号序列进 ...

  6. POJ 3581 Sequence ——后缀数组 最小表示法

    [题目分析] 一见到题目,就有了一个显而易见obviously的想法.只需要每次找到倒过来最小的那一个字符串翻转就可以了. 然而事情并不是这样的,比如说505023这样一个字符串,如果翻转了成为320 ...

  7. POJ 3581 Sequence(后缀数组)题解

    题意: 已知某字符串\(str\)满足\(str_1 > max\{str_2,str_3 \cdots str_n\}\),现要求把这个字符串分成连续的三组,然后每组都翻转,问字典序最小是什么 ...

  8. [POJ3581]Sequence

    [POJ3581]Sequence 题目大意: 给定序列\(A_{1\sim n}\),其中\(A_1\)为最大的数.要把这个序列分成\(3\)个非空段,并将每一段分别反转,求能得到的字典序最小的序列 ...

  9. POJ1743 Musical Theme [后缀数组]

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 27539   Accepted: 9290 De ...

  10. 后缀数组 & 题目

    后缀数组被称为字符串处理神器,要解决字符串问题,一定要掌握它.(我这里的下标全部都是从1开始) 首先后缀数组要处理出两个数组,一个是sa[],sa[i]表示排名第i为的后缀的起始位置是什么,rank[ ...

随机推荐

  1. git 的证书重新设置,以及如何让git 记住提交的用户名和密码

    1.git 的证书的重新设置的命令是: git config --system --unset credential.helper 2.保存git的用户名和密码注意这里是全局保存 git config ...

  2. linux内存条排查

    已发现2个内存错误,应用名称(kernel:),日志内容(hangzhou-jishuan-DDS0248 kernel: sbridge: HANDLING MCE MEMORY ERROR han ...

  3. javascript中Date使用总结(转)

    //全局函数 Date //Date 类的静态方法 Date.parse Date.UTC //Date 对象的建立方法 new Date() new Date(毫秒数) new Date(标准时间格 ...

  4. 转:强化学习(Reinforcement Learning)

    机器学习算法大致可以分为三种: 1. 监督学习(如回归,分类) 2. 非监督学习(如聚类,降维) 3. 增强学习 什么是增强学习呢? 增强学习(reinforcementlearning, RL)又叫 ...

  5. Linux引导过程

    早期时,启动一台计算机意味着要给计算机喂一条包含引导程序的纸带,或者手工使用前端面板地址/数据/控制开关来加载引导程序.尽管目前的计算机已经装备了很多工具来简化引导过程,但是这一切并没有对整个过程进行 ...

  6. c++对拍实现

    直接上代码吧. #include<bits/stdc++.h> using namespace std; int main(){ while(1){ system("./cute ...

  7. php2go - Go 实现 PHP 常用内置函数

    [转]http://www.syyong.com/Go/php2go-Use-Golang-to-implement-PHP-s-common-built-in-functions.html 使用Go ...

  8. ajax获取django的csrf_token

    ''' 方法一: data: { 'teamid': teamid, csrfmiddlewaretoken: '{{ csrf_token }}' //data: {name: 'john', cs ...

  9. python3 多态,绑定方法与非绑定方法

    多态:同一种事物的不同形态(一个抽象类有多个子类,因而多态的概念依赖于继承) 1. 序列类型有多种形态:字符串,列表,元组. 2. 动物有多种形态:人,狗,猪 多态性:多态性是指具有不同功能的函数可以 ...

  10. 【转】cve2014-3153 漏洞之详细分析与利用

    背景学习: Linux Futex的设计与实现 使用者角度看bionic pthread_mutex和linux futex实现 By kernux TopSec α-lab 一 漏洞概述 这个漏洞是 ...