POJ3623:Best Cow Line, Gold(后缀数组)
2015-06-08 22:19
429 查看
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
Sample Output
Source
USACO 2007 December Gold
题意:
每次只能从两边取,要求取出来之后字典序最小
思路:
求出rank数组之后再从左右开始,哪个小取哪个
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
USACO 2007 December Gold
题意:
每次只能从两边取,要求取出来之后字典序最小
思路:
求出rank数组之后再从左右开始,哪个小取哪个
#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-8 int wa ,wb ,wsf ,wv ,sa ; int rank ,height ,s ; //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 = 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; }
相关文章推荐
- Web开发与设计之Google兵器谱-Web开发与设计利器
- Ubuntu下的Juju现在支持systemd和Google Cloud Platform了
- LightOJ 1030 Discovering Gold【概率】
- Django笔记
- go语言实现的目录共享程序
- Django学习(七) 创建第一个Django项目
- 2、Django中模板的使用
- BestCoder Round #43 (hdu5264 - 5266)(数学,LCA)good
- django 中 manage.py通常使用的各种命令大全(包含django 安装指导及测试)
- django使用celery实现异步操作
- Kolmogorov复杂度(转)
- Kolmogorov复杂性简介(转)
- googletest试用
- django1.7后集成south的使用方法
- gom
- golang实现set集合,变相实现切片去重
- google.protobuf.... modul not found
- HangOver
- 【Mongo】聚合函数
- 1、我的第一个Django页面