POJ3623:Best Cow Line, Gold(后缀数组)

POJ3623:Best Cow Line, Gold(后缀数组)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

Description

FJ is about to take his N (1 ≤ N ≤ 30,000) cows to the annual”Farmer of the Year” competition. In this contest every farmer arranges his cows in a line and herds them past the judges.

The contest organizers adopted a new registration scheme this year: simply register the initial letter of every cow in the order they will appear (i.e., If FJ takes Bessie, Sylvia, and Dora in that order he just registers BSD). After the registration phase ends, every group is judged in increasing lexicographic order according to the string of the initials of the cows’ names.

FJ is very busy this year and has to hurry back to his farm, so he wants to be judged as early as possible. He decides to rearrange his cows, who have already lined up, before registering them.

FJ marks a location for a new line of the competing cows. He then proceeds to marshal the cows from the old line to the new one by repeatedly sending either the first or last cow in the (remainder of the) original line to the end of the new line. When he’s finished, FJ takes his cows for registration in this new order.

Given the initial order of his cows, determine the least lexicographic string of initials he can make this way.

Input

* Line 1: A single integer: N
* Lines 2..N+1: Line i+1 contains a single initial (‘A’..’Z’) of the cow in the ith position in the original line

Output

The least lexicographic string he can make. Every line (except perhaps the last one) contains the initials of 80 cows (‘A’..’Z’) in the new line.

Sample Input

6
A
C
D
B
C
B

Sample Output

ABCBCD

Source

#include <iostream>#include <stdio.h>#include <string.h>#include <stack>#include <queue>#include <map>#include <set>#include <vector>#include <math.h>#include <bitset>#include <algorithm>#include <climits>using namespace std;#define LS 2*i#define RS 2*i+1#define UP(i,x,y) for(i=x;i<=y;i++)#define DOWN(i,x,y) for(i=x;i>=y;i--)#define MEM(a,x) memset(a,x,sizeof(a))#define W(a) while(a)#define gcd(a,b) __gcd(a,b)#define LL long long#define N 2000005#define MOD 1000000007#define INF 0x3f3f3f3f#define EXP 1e-8int wa[N],wb[N],wsf[N],wv[N],sa[N];int rank[N],height[N],s[N];//sa:字典序中排第i位的起始位置在str中第sa[i]//rank:就是str第i个位置的后缀是在字典序排第几//height:字典序排i和i-1的后缀的最长公共前缀int cmp(int *r,int a,int b,int k){    return r[a]==r[b]&&r[a+k]==r[b+k];}void getsa(int *r,int *sa,int n,int m)//n要包括末尾加入的0{    int i,j,p,*x=wa,*y=wb,*t;    for(i=0; i<m; i++)  wsf[i]=0;    for(i=0; i<n; i++)  wsf[x[i]=r[i]]++;    for(i=1; i<m; i++)  wsf[i]+=wsf[i-1];    for(i=n-1; i>=0; i--)  sa[--wsf[x[i]]]=i;    p=1;    j=1;    for(; p<n; j*=2,m=p)    {        for(p=0,i=n-j; i<n; i++)  y[p++]=i;        for(i=0; i<n; i++)  if(sa[i]>=j)  y[p++]=sa[i]-j;        for(i=0; i<n; i++)  wv[i]=x[y[i]];        for(i=0; i<m; i++)  wsf[i]=0;        for(i=0; i<n; i++)  wsf[wv[i]]++;        for(i=1; i<m; i++)  wsf[i]+=wsf[i-1];        for(i=n-1; i>=0; i--)  sa[--wsf[wv[i]]]=y[i];        t=x;        x=y;        y=t;        x[sa[0]]=0;        for(p=1,i=1; i<n; i++)            x[sa[i]]=cmp(y,sa[i-1],sa[i],j)? p-1:p++;    }}void getheight(int *r,int n)//n不保存最后的0{    int i,j,k=0;    for(i=1; i<=n; i++)  rank[sa[i]]=i;    for(i=0; i<n; i++)    {        if(k)            k--;        else            k=0;        j=sa[rank[i]-1];        while(r[i+k]==r[j+k])            k++;        height[rank[i]]=k;    }}char str[10];int main(){    int n,i,j,k;    while(~scanf("%d",&n))    {        int len = 0;        for(i = 0; i<n; i++)        {            scanf("%s",str);            s[i] = str[0];            s[2*n-i] = str[0];        }        s[n] = 0;        s[2*n+2] = 0;        getsa(s,sa,2*n+2,200);        for(i = 0; i<2*n+2; i++)            rank[sa[i]] = i;        int l = 0,r = n+1;        while((len++)<n)        {            if(rank[l]<rank[r])            {                printf("%c",s[l]);                l++;            }            else            {                printf("%c",s[r]);                r++;            }            if(len%80==0)                printf("\n");        }        if(len%80)            printf("\n");    }    return 0;}

版权声明:本文博主原创文章。博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116913.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java中的Map集合

    java中的Map集合什么是Map集合?Map用于保存具有映射关系的数据,Map集合里保存着两组值,一组用于保存Map的ley,另一组保存着Map的value。图解map集合的作用和查字典类似,通过key找到对应的value,通过页数找到对应的信息。用学生类来说,key相当于学号,value对应name,age,sex等信息。用这种对应关系方便查找。Map和Set的关系可以说关系是很密切了,虽然Map中存…

    2022年5月30日
    41
  • 线程用户态和内核态

    线程用户态和内核态(1)用户态和内核态的概念?—>内核态:CPU可以访问内存所有数据,包括外围设备,例如硬盘,网卡.CPU也可以将自己从一个程序切换到另一个程序—>用户态:只能受限的访问内存,且不允许访问外围设备.占用CPU的能力被剥夺,CPU资源可以被其他程序获取(2)为什么需要用户态和内核态?—>由于需要限制不同的程序之间的访问能力,防止他们获取别的程序的内存数据,…

    2025年7月21日
    3
  • 2019版idea激活码(破解版激活)[通俗易懂]

    2019版idea激活码(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    696
  • springboot上传文件大小配置

    springboot上传文件大小配置springboot上传文件大小配置有两种方法,一种是直接再配置文件配置,一种是通过添加一个Bean来实现。第一种:application.properties中添加spring.http.multipart.maxFileSize=10MB spring.http.multipart.maxRequestSize=10MB其中,   maxFileSize是单个文件大…

    2022年5月10日
    47
  • java 取余和取模运算之间的区别「建议收藏」

    java 取余和取模运算之间的区别「建议收藏」转自lee371042https://blog.csdn.net/lee371042/article/details/102553342packageOperator;importjava.math.BigInteger;/***假如有两个数:*amod(b)与a%b,b为正整数,*一种叫a对b取模,另一个叫a对b取余,两种叫法有什么区别呢?*通常情况下,取模运算也叫取余运算,*它们返回的结果都是一个数对另一个数的余数,**区别在于当a是一

    2022年6月3日
    37
  • java 中级面试题及答案「建议收藏」

    java 中级面试题及答案「建议收藏」java中级面试题及答案1.MyBatis中,根据Id查询单个Order对象,动态SQL如何编写?A.SELECT*FROMOrderWHEREID=#{id};B.SELECT*FROMOrderWHEREID=#{id};C.SELECT*FROMOrderWHEREID=#{id};D.SELECT*FROMOrderWHEREID=#{id};B2.当一个bean的作用域为Prototype,表示含义是什

    2022年6月16日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号