http://poj.org/problem?id=3581

这题说是给了N个数字组成的序列A1 A2 ..An 其中A1 大于其他的数字 , 现在要把序列分成三段并将每段分别反转求最小字典序

以后还是老老实实用基数排序 用sort wa 了 一晚

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
#include <vector>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
const int maxn =200005;
struct SuffixArry
{int c[maxn*2],t[maxn*2],t1[maxn*2],sa[maxn*2];void build(int n,int m,int *S){int *x=t,*y=t1,i;for( i=0; i<m; i++)c[i]=0;for( i=0; i<n; i++)c[x[i]=S[i] ]++;for( i=1; i<m; i++)c[i]+=c[i-1];for( i=n-1; i>=0; i--)sa[ --c[ x[i] ] ]=i;int p;for(int k=1; k<=n; k<<=1 ){ p=0;for( i = n-k; i<n; i++)y[p++]=i;for( i=0; i<n; i++) if(sa[i]>=k)y[p++]=sa[i]-k;for( i=0; i<m; i++)c[ i ] =0 ;for( i=0 ; i<n; i++ )c[ x[ y[i] ] ]++;for( i=1; i<m; i++) c[i]+=c[i-1];for( i=n-1; i>=0; i--) sa[--c[ x[ y[i] ] ] ]=y[i];swap(x,y);p=1; x[ sa[ 0 ] ] = 0;for(int i=1; i<n; i++)x[ sa[i] ] = y[ sa[i] ]== y[ sa[i-1] ]&& y[ sa[i]+k ]==y[sa[i-1]+k]?p-1:p++;if(p>=n)break;m=p;}}void clear(){memset(t,-1,sizeof(t));memset(t1,-1,sizeof(t1));}
}T;
int A[maxn],B[maxn],C[maxn],rev[maxn*2];
void revercopy(int *a, int *b, int len)
{for(int i=0; i<len; i++){ b[i]=a[len-1-i];}
}
void rever(int *a, int len)
{for(int i=0; i<len/2; i++ ){int t= a[i]; a[i]=a[len-1-i];a[len-1-i]=t;}
}
int main(int argc, char *argv[]) {int n;scanf("%d",&n);for(int i=0; i<n; i++){scanf("%d",&A[i]);B[i]=A[i];}sort(B,B+n);int L=unique(B,B+n)-B;for(int i=0; i<n; i++){C[i]=lower_bound(B,B+L,A[i])-B;}int p1;T.clear();revercopy(C,rev,n);T.build(n,L,rev);for(int i=0; i<n; i++){p1 = n-T.sa[i];if(p1>0&&n-p1>=2)break;}if(p1<1||n-p1<2)while(true){};int m= n-p1;revercopy(C+p1,rev,m); //for(int i=0; i<m; i++)printf("%d ",rev[i]);revercopy(C+p1,rev+m,m);//for(int i=0; i<m*2; i++)printf("%d ",rev[i]);T.build(m*2,L,rev);int p2;for(int i=0; i<m*2; i++){ p2 = p1 + m - T.sa[ i ];if(p2>p1&&n-p2>=1)break;}if(p2<=p1||n-p2<1)while(true){};rever(A,p1);rever(A+p1,p2-p1);rever(A+p2,n-p2);for(int i=0; i<n; i++) printf("%d\n",A[i]);return 0;
}

View Code

转载于:https://www.cnblogs.com/Opaser/p/4496523.html

POJ3581 后缀数组相关推荐

  1. 寻找一个字符串的重复子串 后缀数组

    什么是后缀数组 令字符串 S=S[1]S[2]...S[n]S=S[1]S[2]...S[n]{\displaystyle S=S[1]S[2]...S[n]} , S[i,j]S[i,j]{\dis ...

  2. 【2012百度之星/资格赛】H:用户请求中的品牌 [后缀数组]

    时间限制: 1000ms 内存限制: 65536kB 描述 馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到一些很奇葩的词汇.在比方说"johnsonj ...

  3. Boring counting HDU - 3518 (后缀数组)

    Boring counting \[ Time Limit: 1000 ms \quad Memory Limit: 32768 kB \] 题意 给出一个字符串,求出其中出现两次及以上的子串个数,要 ...

  4. HDU4080 Stammering Aliens(二分 + 后缀数组)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4080 Description Dr. Ellie Arroway has establish ...

  5. 后缀数组 + Hash + 二分 or Hash + 二分 + 双指针 求 LCP ---- 2017icpc 青岛 J Suffix (假题!!)

    题目链接 题目大意: 就是给你n个串每个串取一个后缀,要求把串拼起来要求字典序最小!! sum_length_of_n≤5e5sum\_length\_of\_n\leq 5e5sum_length_ ...

  6. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]

    题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...

  7. [Ahoi2013]差异[后缀数组+单调栈]

    链接 解题思路:很明显前面∑1<=i<j<=nlen(Ti)+len(Tj)\sum_{1<=i<j<=n}len(T_i)+len(T_j)∑1<=i< ...

  8. poj2217详解 ( 后缀数组 + 高度数组 )

    题目大概意思就是 给两个字符串,求最长公共字符串子串长度 我们可以考虑用后缀数组和高度数组 一个字符串 中 最长的两个相同字符串长度, 不就是 后缀数组中相邻两个后缀的最长公共前缀, 不就是 高度数组 ...

  9. 树链剖分 + 后缀数组 - E. Misha and LCP on Tree

    E. Misha and LCP on Tree Problem's Link Mean: 给出一棵树,每个结点上有一个字母.每个询问给出两个路径,问这两个路径的串的最长公共前缀. analyse: ...

最新文章

  1. 什么是python-马哥教育官网-专业Linux培训班,Python培训机构
  2. JavaScript基础一
  3. java并发编程(2)——wait和notify解析
  4. docker 安装redis第三方集群方案 codis
  5. 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - B. 星系炸弹
  6. 汇编工具安装三:已经配置好的汇编开发工具!
  7. AUTOSAR从入门到精通100讲(十三)--autosar架构中的ARXML
  8. 静态html js文件上传,js实现动态添加上传文件页面
  9. python 量化交易_基于Python的量化交易工具清单(上)
  10. 用Gradle命令行编译Android工程
  11. dev_t的主次编号
  12. script标签中的defer和async属性
  13. okhttp离线缓存_Android改造OkHttp离线缓存
  14. mysql tuner sh_MySQL性能提议者:mysqltuner.pl
  15. 甘特图 知乎_哪一款甘特图软件最好用?
  16. vim中替换字符串的方法有哪些
  17. Google Authenticator(谷歌身份验证器)在苹果手机上IOS系统中 输入密钥时提示密钥无效的解决方案
  18. windows下pyqt4
  19. linux mint 19界面美化,Linux Mint19字体、主题美化
  20. minigui3.2 安装教程

热门文章

  1. python编辑距离正则匹配_详解一道腾讯面试题:编辑距离
  2. win7系统的设置在哪里_win10系统改装win7之BIOS设置教程
  3. scala 类的多态_Scala多态方法和显式引用
  4. 函数式编程和面向对象式编程_比较函数式编程,命令式编程和面向对象的编程
  5. 深度学习 keras_Keras深度学习教程
  6. mac系统安装python(2.7)requests库
  7. “猿式浪漫”:Java小白也能写出的表白程序
  8. 蚂蚁、字节、拼多多,你的简历能通过几家?
  9. Java基础篇:循环语句之while语句
  10. [存]超酷JS拖拽翻页效果