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)
上一篇 2022年1月13日 下午2:00
下一篇 2022年1月13日 下午3:00


相关推荐

  • 8 NoSQL数据库有哪些?

    8 NoSQL数据库有哪些?文章目录 1 键值数据库 2 列族数据库 3 文档数据库 4 图形数据库关系型数据库产品很多 如 MySQL Oracle MicrosoftSQL 等 但它们的基本模型都是关系型数据模型 NoSQL 并没有统一的模型 而且是非关系型的 常见的 NoSQL 数据库包括键值数据库 列族数据库 文档数据库和图形数据库 其具体分类和特点如表所示 NoSQL 数据库分类和特点分类相关产品应用场景数据模型优点缺点键值数据库 Redis Memcache

    2026年3月19日
    3
  • mysql latin1优点_MySQL数据库latin1详解

    mysql latin1优点_MySQL数据库latin1详解因为 ISO 8859 1 编码范围使用了单字节内的所有空间 在支持 ISO 8859 1 的系统中传输和存储其他任何编码的字节流都不会被抛弃 换言 Latin1 是 ISO 8859 1 的别名 有些环境下写作 Latin 1 ISO 8859 1 编码是单字节编码 向下兼容 ASCII 其编码范围是 0x00 0xFF 0x00 0x7F 之间完全和 ASCII 一致 0x80 0x9F 之间是控制字符 0xA0 0xFF

    2026年3月19日
    2
  • 国产龙虾三剑客,为什么成了全球虾农的最优选?

    国产龙虾三剑客,为什么成了全球虾农的最优选?

    2026年3月12日
    2
  • SQL 2008 R2密钥

    SQL 2008 R2密钥数据中心版 PTTFM X467G P7RH2 3Q6CG 4DMYBDDT3B 8W62X P9JD6 8MX7M HWK38 企业版 R88PF GMCFT KM2KR 4R7GB 43K4BGYF3T H2V88 GRPPH HWRJP QRTYB

    2026年3月19日
    1
  • js中用正则表达式替换字符串中所有指定字符串

    js中用正则表达式替换字符串中所有指定字符串用正则表达式可以用 js 中的 RegExp 对象 有两个参数 第一个参数指定了正则表达式的模式或其他正则表达式 第二个参数是可选的 包含属性 g i 和 m 分别用于指定全局匹配 区分大小写的匹配和多行匹配 想要选择所有指定字符串 第二个参数就要填 g varstart 010 varrep 10 start start replace new

    2026年3月17日
    2
  • OpenClaw部署后如何监控运行状态?全方位运维指南

    OpenClaw部署后如何监控运行状态?全方位运维指南

    2026年3月13日
    1

发表回复

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

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