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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • javascript 跳转_iframe跳转另一个页面

    javascript 跳转_iframe跳转另一个页面 按钮式:    链接式:  返回上一步  ”>返回上一步  直接跳转式:  window.location.href=http://www.9ba.cn;  开新窗口:  云上的日子 

    2022年8月12日
  • XMLElement,XMLDocument 用法「建议收藏」

    XMLElement,XMLDocument 用法「建议收藏」来源http://www.cr173.com/html/23515_1.html一前言先来了解下操作XML所涉及到的几个类及之间的关系 如果大家发现少写了一些常用的方法,麻烦在评论中指出,我一定会补上的!谢谢大家*1XMLElement主要是针对节点的一些属性进行操作*2XMLDocument主要是针对节点的CUID操作*3XMLNode为抽象

    2022年6月19日
  • 以上都点赞表情包图片_超级点赞图片

    以上都点赞表情包图片_超级点赞图片原题链接微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。然而有这么一种人,他们会通过给自己看到的一切内容点赞来狂刷存在感,这种人就被称为“点赞狂魔”。他们点赞的标签非常分散,无法体现出明显的特性。本题就要求你写个程序,通过统计每个人点赞的不同标签的数量,找出前3名点赞狂魔。输入格式:输入在第一行给出一个正整数N(≤100),是待统计的用户数。随后N行,每行列出一位用户的点赞标签。格式为“Name K F​1​

    2022年8月8日
  • 静态路由介绍_静态路由下一跳地址类型

    静态路由介绍_静态路由下一跳地址类型网络上通过各种设备传递数据,最常见的就是路由器和交换机。本篇介绍路由器的静态路由协议。先简要说一下路由条目和路由表(熟悉的可略过):一个数据包从源IP地址到目标IP地址间可能穿过多个路由器,也可能有多条路径通往目标IP地址。那路由器收到数据后,如何知道哪个端口能通往目标地址呢?如果多个端口都可通往目标地址,选择用哪个端口才是最优路径呢?依据的就是路由表。路由表就是路由器的灵魂,是多个路由条目的…

    2022年9月24日
  • Eclipse最新最简最详细安装教程

    Eclipse最新最简最详细安装教程1、首先打开官方地址(见下面)Eclipse官方下载地址:点击打开官方链接2、点击红箭头指向的红框中的“DownloadPackages”。3、出现新的页面之后往下翻找到并点击红箭头指向的红色矩形的部分EclipseIDEforJavaEEDevelopers项的最右边,点击“64-bit”。4、进入到新的页面之后点击红色箭头指向…

    2022年4月8日
  • 干掉IDEA:JetBrains推出下一代轻量级开发工具Fleet

    干掉IDEA:JetBrains推出下一代轻量级开发工具FleetJetBrains以20年的IDE开发经验为基础从头打造了号称下一代的开发工具Fleet,它使用了IntelliJ代码处理引擎,具有分布式IDE架构和重新设计的UI。它的…

    2022年5月21日

发表回复

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

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