1640: [Usaco2007 Nov]Best Cow Line 队列变换
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 493 Solved: 253
[Submit][Status]
Description
FJ打算带着他可爱的N (1 ≤ N ≤ 2,000)头奶牛去参加”年度最佳老农”的比赛.在比赛中,每个农夫把他的奶牛排成一列,然后准备经过评委检验. 比赛中简单地将奶牛的名字缩写为其头字母(the initial letter of every cow),举个例子,FJ带了Bessie, Sylvia,和Dora,那么就可以缩写为BSD. FJ只需将奶牛的一个序列重新排列,然后参加比赛.他可以让序列中的第一头奶牛,或者最后一头走出来,站到新队列的队尾. 利欲熏心的FJ为了取得冠军,他就必须使新队列的字典序尽量小. 给你初始奶牛序列(用头字母)表示,然后按照上述的规则组成新序列,并使新序列的字典序尽量小.
Input
第1行:一个整数N.
第2行至第N+1行:每行一个大写字母,表示初始序列中该奶牛的头字母.
Output
得到的最小字典序的序列.每输出80个字母需要一个换行!
Sample Input
6
A
C
D
B
C
B
A
C
D
B
C
B
Sample Output
ABCBCD
HINT
Source
题解:
同上一个队列变换,不过貌似这个数据小,都是直接贪心过的。。。直接上上一题的代码了。。。
代码:
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<iostream> 7 #include<vector> 8 #include<map> 9 #include<set> 10 #include<queue> 11 #include<string> 12 #define inf 1000000000 13 #define maxn 70000 14 #define maxm 500+100 15 #define eps 1e-10 16 #define ll long long 17 #define pa pair<int,int> 18 using namespace std; 19 inline int read() 20 { 21 int x=0,f=1;char ch=getchar(); 22 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 23 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 24 return x*f; 25 } 26 inline bool cmp(int *r,int a,int b,int l) 27 { 28 return r[a]==r[b]&&r[a+l]==r[b+l]; 29 } 30 int wa[maxn],wb[maxn],wr[maxn],sa[maxn],rank[maxn],a[maxn],n; 31 void da(int *r,int *sa,int n,int m) 32 { 33 int i,j,p,*x=wa,*y=wb,*t; 34 for(i=0;i<m;i++)wr[i]=0; 35 for(i=0;i<n;i++)wr[x[i]=r[i]]++; 36 for(i=1;i<m;i++)wr[i]+=wr[i-1]; 37 for(i=n-1;i>=0;i--)sa[--wr[x[i]]]=i; 38 for(j=1,p=1;p<n;j<<=1,m=p) 39 { 40 for(p=0,i=n-j;i<n;i++)y[p++]=i; 41 for(i=0;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j; 42 for(i=0;i<m;i++)wr[i]=0; 43 for(i=0;i<n;i++)wr[x[y[i]]]++; 44 for(i=1;i<m;i++)wr[i]+=wr[i-1]; 45 for(i=n-1;i>=0;i--)sa[--wr[x[y[i]]]]=y[i]; 46 for(t=x,x=y,y=t,p=1,i=1,x[sa[0]]=0;i<n;i++) 47 x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; 48 } 49 } 50 int main() 51 { 52 n=read(); 53 for(int i=0;i<n;i++) 54 { 55 char ch=' '; 56 while(ch<'A'||ch>'Z')ch=getchar(); 57 a[i]=int(ch-'A'+1); 58 } 59 int tot=2*n+1; 60 a[n]=0;a[tot]=0; 61 for(int i=1;i<=n;i++)a[n+i]=a[n-i]; 62 da(a,sa,tot+1,28); 63 //for(int i=0;i<=tot;i++)cout<<i<<' '<<sa[i]<<endl; 64 for(int i=1;i<=tot;i++)rank[sa[i]]=i; 65 //for(int i=0;i<=tot;i++)cout<<i<<' '<<rank[i]<<endl; 66 int l=0,r=n+1; 67 while(l+r-n-1<n) 68 { 69 if(rank[l]<rank[r])putchar(a[l++]+'A'-1);else putchar(a[r++]+'A'-1); 70 if(!((l+r-n-1)%80))putchar(' '); 71 } 72 return 0; 73 }