BZOJ 1640: [Usaco2007 Nov]Best Cow Line 队列变换
Description
FJ打算帶著他可愛的N (1 ≤ N ≤ 2,000)頭奶牛去參加”年度最佳老農(nóng)”的比賽.在比賽中,每個(gè)農(nóng)夫把他的奶牛排成一列,然后準(zhǔn)備經(jīng)過評(píng)委檢驗(yàn). 比賽中簡(jiǎn)單地將奶牛的名字縮寫為其頭字母(the initial letter of every cow),舉個(gè)例子,FJ帶了Bessie, Sylvia,和Dora,那么就可以縮寫為BSD. FJ只需將奶牛的一個(gè)序列重新排列,然后參加比賽.他可以讓序列中的第一頭奶牛,或者最后一頭走出來,站到新隊(duì)列的隊(duì)尾. 利欲熏心的FJ為了取得冠軍,他就必須使新隊(duì)列的字典序盡量小. 給你初始奶牛序列(用頭字母)表示,然后按照上述的規(guī)則組成新序列,并使新序列的字典序盡量小.
Input
第1行:一個(gè)整數(shù)N.
第2行至第N+1行:每行一個(gè)大寫字母,表示初始序列中該奶牛的頭字母.
Output
得到的最小字典序的序列.每輸出80個(gè)字母需要一個(gè)換行!
題解:
將該串后面加一個(gè)特殊字符后將原串翻轉(zhuǎn)接到后面,求這個(gè)新串的后綴數(shù)組、rank數(shù)組,就可以O(shè)(1)快速比較是從后面取較優(yōu)還是從前面取較優(yōu)。
貪心取即可。
代碼:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring>//by zrt //problem: using namespace std; typedef long long LL; const int inf(0x3f3f3f3f); const double eps(1e-9); char s[60005]; int n,m; const int MAXN=60005; int sa[MAXN],t[MAXN],t2[MAXN],c[MAXN],rank[MAXN]; void build_sa(int m){int *x=t,*y=t2;for(int i=0;i<m;i++) c[i]=0;for(int i=0;i<n;i++) c[x[i]=s[i]]++;for(int i=1;i<m;i++) c[i]+=c[i-1];for(int i=n-1;i>=0;i--) sa[--c[x[i]]]=i;for(int k=1;k<=n;k<<=1){int p=0;for(int i=n-k;i<n;i++) y[p++]=i;for(int i=0;i<n;i++) if(sa[i]>=k) y[p++]=sa[i]-k;for(int i=0;i<m;i++) c[i]=0;for(int i=0;i<n;i++) c[x[y[i]]]++;for(int i=1;i<m;i++) c[i]+=c[i-1];for(int i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i];swap(x,y);p=1;x[sa[0]]=0;for(int i=1;i<n;i++){x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++;}if(p>=n) break;m=p;} } int main(){#ifdef LOCALfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifscanf("%d",&n);for(int i=0;i<n;i++) scanf("%s",&s[i]);s[n]='$';for(int i=0;i<n;i++) s[i+n+1]=s[n-i-1];m=n;n<<=1;n=n+1;s[n]='\0';build_sa(128);for(int i=0;i<n;i++) rank[sa[i]]=i;int cc=0;int l=0,r=m-1;for(int i=0;i<m;i++){int a=rank[l];int b=rank[(m-r)+m];cc++;if(a<b){putchar(s[l++]);}else putchar(s[r--]);if(cc==80) cc=0,putchar('\n');}return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/zrts/p/bzoj1640.html
總結(jié)
以上是生活随笔為你收集整理的BZOJ 1640: [Usaco2007 Nov]Best Cow Line 队列变换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汉字和utf编码转换
- 下一篇: Linux Bash Shell j简单