题意:给一个串,串的第一个字符比后面的都大,要把它分成三段,然后反转每一段,求能得到的字典序最小的串是什么。

首先,第一段是可以确定的:把原串反转,因为第一个字符是最大的,它是唯一的,不存在反转串的后缀之间有包含关系,所以取最小的后缀这就是第一段的字符串;

然后后面两段,如果确定分割位置可以发现这两段字符串构成是一个从分割位置出发逆时针循环回来的串——

即接下来要求的就是剩余部分的反转的最小表示,可以用后缀数组来做:把串加长一倍,答案就在最小的且长度大于等于原串长度的后缀了。

注意,分的段要非空。。所以还要在第一段、后面两段的分割加些判断。

这题好难A,不知道为什么。。WA来WA去。。改啊改,终于RE来RE去。。跟着别人把数字离散化后才AC了。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<algorithm>
  5. using namespace std;
  6. #define MAXN 222222
  7. int wa[MAXN],wb[MAXN],wv[MAXN],ws[MAXN];
  8. int cmp(int *r,int a,int b,int l){
  9. return r[a]==r[b] && r[a+l]==r[b+l];
  10. }
  11. int sa[MAXN];
  12. void SA(int *r,int n,int m){
  13. int *x=wa,*y=wb;
  14.  
  15. for(int i=; i<m; ++i) ws[i]=;
  16. for(int i=; i<n; ++i) ++ws[x[i]=r[i]];
  17. for(int i=; i<m; ++i) ws[i]+=ws[i-];
  18. for(int i=n-; i>=; --i) sa[--ws[x[i]]]=i;
  19.  
  20. int p=;
  21. for(int j=; p<n; j<<=,m=p){
  22. p=;
  23. for(int i=n-j; i<n; ++i) y[p++]=i;
  24. for(int i=; i<n; ++i) if(sa[i]>=j) y[p++]=sa[i]-j;
  25. for(int i=; i<n; ++i) wv[i]=x[y[i]];
  26. for(int i=; i<m; ++i) ws[i]=;
  27. for(int i=; i<n; ++i) ++ws[wv[i]];
  28. for(int i=; i<m; ++i) ws[i]+=ws[i-];
  29. for(int i=n-; i>=; --i) sa[--ws[wv[i]]]=y[i];
  30. swap(x,y); x[sa[]]=; p=;
  31. for(int i=; i<n; ++i) x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
  32. }
  33. }
  34.  
  35. int a[MAXN],r[MAXN];
  36. int b[MAXN],bn;
  37. int main(){
  38. int n;
  39. scanf("%d",&n);
  40. for(int i=; i<n; ++i){
  41. scanf("%d",a+i);
  42. b[i]=a[i];
  43. }
  44. sort(b,b+n);
  45. bn=unique(b,b+n)-b;
  46. for(int i=; i<n; ++i){
  47. a[i]=lower_bound(b,b+bn,a[i])-b+;
  48. }
  49. for(int i=; i<n; ++i){
  50. r[i]=a[n-i-];
  51. }
  52. r[n]=;
  53. SA(r,n+,bn+);
  54. int m=;
  55. for(int i=; i<=n; ++i){
  56. if(sa[i]>=){
  57. for(int j=sa[i]; j<n; ++j){
  58. printf("%d\n",b[r[j]-]);
  59. }
  60. n=sa[i];
  61. for(int j=; j<sa[i]; ++j){
  62. r[j+sa[i]]=r[j];
  63. m+=;
  64. }
  65. r[m]=;
  66. break;
  67. }
  68. }
  69. SA(r,m+,bn+);
  70. for(int i=; i<=m; ++i){
  71. if(m-sa[i]>=n && sa[i]!=m/ && sa[i]!=){
  72. for(int j=; j<n; ++j) printf("%d\n",b[r[sa[i]+j]-]);
  73. break;
  74. }
  75. }
  76. return ;
  77. }

POJ3581 Sequence(后缀数组)的更多相关文章

  1. POJ3581 Sequence —— 后缀数组

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

  2. POJ3581:Sequence(后缀数组)

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

  3. POJ 3581 Sequence(后缀数组)

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

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

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

  5. POJ 3581 Sequence [后缀数组]

    Sequence Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6911   Accepted: 1543 Case Tim ...

  6. 后缀数组 POJ 3581 Sequence

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

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

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

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

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

  9. [POJ3581]Sequence

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

随机推荐

  1. show processlist 其中status详解(适用于所有概况)

    mysql show processlist分析 2011-04-11 16:13:00 分类: Mysql/postgreSQL mysql> show processlist; +—–+—— ...

  2. MFC 中控件的启用与禁用

    启用和禁用控件可以调用CWnd::EnableWindow 函数. BOOL EnableWindow(BOOL bEnable = TRUE); 判断控件是否可用可以调用 CWnd::IsWindo ...

  3. 你真的会用AsyncTask吗?(一)

    一个典型AsyncTask的. view source print? 01 public class DialogTestActivity extends Activity { 02     priv ...

  4. 在生产环境使用Docker部署应用

    导读 Docker现在越来越流行,但是真正在生产环境部署Docker还是个比较新的概念,还没有一个标准的流程.作者是ROR的程序员,作者结合平时的部署经验,联系Docker的特点,向大家分享了其在生产 ...

  5. Unity 3D学习之 Prime31 Game Center插件用法

    http://momowing.diandian.com/post/2012-11-08/40041806328 It's my life~: 为app 连入Game Center 功能而困扰的朋友们 ...

  6. MySQL sql语句总结

    1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数据的 d ...

  7. 【Python】Python AES 对称加密示例

    代码: import sys from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex AES_SECRET_KEY = ...

  8. 【SpringMVC】SpringMVC系列10之视图与视图解析器

    10.视图与视图解析器 10.1.概述     请求处理方法执行完成后,最终返回一个 ModelAndView处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象, ...

  9. Java,Calendar 获得明天凌晨的时间time

    /** * 获得明天凌晨的时间time * * @return */ private long getNextDayZeroTime() { Calendar calendar = Calendar. ...

  10. iterator与const_iterator及const iterator区别

    如果你传递过来一个const类型的容器,那么只能用const_iterator来遍历.  C++ Code  12345   void Method(const vector<int> v ...