【后缀数组】poj3581 Sequence
考虑第一次切割,必然切割的是翻转后字典序最小的前缀,伪证:
若切割位置更靠前:则会导致第一个数翻转后更靠前,字典序必然更大。
若切割位置更靠后,则显然也会导致字典序更大。
↑,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的更多相关文章
- POJ3581 Sequence —— 后缀数组
题目链接:https://vjudge.net/problem/POJ-3581 Sequence Time Limit: 5000MS Memory Limit: 65536K Total Su ...
- POJ3581 Sequence(后缀数组)
题意:给一个串,串的第一个字符比后面的都大,要把它分成三段,然后反转每一段,求能得到的字典序最小的串是什么. 首先,第一段是可以确定的:把原串反转,因为第一个字符是最大的,它是唯一的,不存在反转串的后 ...
- POJ 3581 Sequence(后缀数组)
Description Given a sequence, {A1, A2, ..., An} which is guaranteed A1 > A2, ..., An, you are to ...
- 后缀数组 POJ 3581 Sequence
题目链接 题意:把n个数字(A1比其他数字都大)的序列分成三段,每段分别反转,问字典序最小的序列. 分析:因为A1比其他数字都大,所以反转后第一段结尾是很大的数,相当是天然的分割线,第一段可以单独考虑 ...
- Codeforces VK Cup 2015 A.And Yet Another Bracket Sequence(后缀数组+平衡树+字符串)
这题做得比较复杂..应该有更好的做法 题目大意: 有一个括号序列,可以对其进行两种操作: · 向里面加一个括号,可以在开头,在结尾,在两个括号之间加. · 对当前括号序列进 ...
- POJ 3581 Sequence ——后缀数组 最小表示法
[题目分析] 一见到题目,就有了一个显而易见obviously的想法.只需要每次找到倒过来最小的那一个字符串翻转就可以了. 然而事情并不是这样的,比如说505023这样一个字符串,如果翻转了成为320 ...
- POJ 3581 Sequence(后缀数组)题解
题意: 已知某字符串\(str\)满足\(str_1 > max\{str_2,str_3 \cdots str_n\}\),现要求把这个字符串分成连续的三组,然后每组都翻转,问字典序最小是什么 ...
- [POJ3581]Sequence
[POJ3581]Sequence 题目大意: 给定序列\(A_{1\sim n}\),其中\(A_1\)为最大的数.要把这个序列分成\(3\)个非空段,并将每一段分别反转,求能得到的字典序最小的序列 ...
- POJ1743 Musical Theme [后缀数组]
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 27539 Accepted: 9290 De ...
- 后缀数组 & 题目
后缀数组被称为字符串处理神器,要解决字符串问题,一定要掌握它.(我这里的下标全部都是从1开始) 首先后缀数组要处理出两个数组,一个是sa[],sa[i]表示排名第i为的后缀的起始位置是什么,rank[ ...
随机推荐
- Java之戳中痛点 - (1)易变业务使用脚本语言编写
脚本语言的3大特征: 1.灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型:2.便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务3.简单:脚本语言语法比 ...
- AngularJs学习——何时应该使用Directive、Controller、Service?
翻译:大漠穷秋 原文链接:http://kirkbushell.me/when-to-use-directives-controllers-or-services-in-angular/ 一.简述 A ...
- [Evernote]印象笔记使用经验技巧
一 软件使用 现在使用Windows客户端的印象笔记 + iPhone移动端印象笔记 + chrome浏览器剪藏插件. 在试用了很多云笔记后,还是选择了印象笔记,并且有许多的 ...
- C++ 智能指针的简单实现
智能指针的用处:在c++中,使用普通指针容易造成堆内存的泄露问题,即程序员会忘记释放,以及二次释放,程序发生异常时内存泄漏等问题,而使用智能指针可以更好的管理堆内存.注意,在这里智能指针是一个类而非真 ...
- 【BZOJ1857】【SCOI2010】传送带 [三分]
传送带 Time Limit: 1 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description 在一个2维平面上有两条传送带,每一条传送 ...
- [POJ2774]Long Long Message 解题报告
Long Long Message Description The little cat is majoring in physics in the capital of Byterland. A p ...
- django-crontab
django-cromtab实现定时任务 参考:https://www.jianshu.com/p/1def9226158d ''' 首先安装插件:pip install django-crontab ...
- POJ1236 (强连通分量缩点求入度为0和出度为0的分量个数)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13804 Accepted: 55 ...
- Mybatis三剑客
1.Mybatis-generator 自动化生成数据库交互代码->dao+pojo+xml 2.Mybatis-plugin dao文件和xml自动跳转,验证正确性,在xml中只能提示等功能 ...
- 【POI2017||bzoj4726】Flappy Birds
外国人很良心的啊,这题比NOIP那题还简单…… 不用管他最后的位置,因为移动的次数肯定是恒定的,所以维护在每一个柱子的位置能飞到的范围,递推下去即可. #include<bits/stdc++. ...