1640: [Usaco2007 Nov]Best Cow Line 队列变换|后缀数组|贪心
2016-03-23 07:55
507 查看
做完1692发现还有弱化版本1640
打板子刷水题大法好,骗访问量大法好
打板子刷水题大法好,骗访问量大法好
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<vector> #include<cstdio> #include<queue> #include<cmath> #include<set> #include<map> #define inf 0x7FFFFFFF #define ll long long #define N 10005 using namespace std; char get() { char c=getchar(); for(;c>'Z'||c<'A';c=getchar()); return c; } char s ; int t1 ,t2 ,cc ,sa ,rank ; int n,m,len; bool cmp(int *y,int a,int b,int k) { int a1=y[a],b1=y[b]; int a2=a+k>=len?-1:y[a+k]; int b2=b+k>=len?-1:y[b+k]; return a1==b1&&a2==b2; } void make_sa() { int *x=t1,*y=t2,m=266; for(int i=0;i<len;i++)++cc[x[i]=s[i]]; for(int i=1;i<m;i++)cc[i]+=cc[i-1]; for(int i=len-1;~i;i--)sa[--cc[x[i]]]=i; for(int k=1;k<len;k<<=1) { int p=0; for(int i=len-k;i<len;i++)y[p++]=i; for(int i=0;i<len;i++)if(sa[i]>=k)y[p++]=sa[i]-k; for(int i=0;i<m;i++)cc[i]=0; for(int i=0;i<len;i++)++cc[x[y[i]]]; for(int i=1;i<m;i++)cc[i]+=cc[i-1]; for(int i=len-1;~i;i--)sa[--cc[x[y[i]]]]=y[i]; swap(x,y);x[sa[0]]=0;m=1; for(int i=1;i<len;i++)x[sa[i]]=cmp(y,sa[i],sa[i-1],k)?m-1:m++; if(m>len)break; } for(int i=0;i<len;i++)rank[sa[i]]=i; } int main() { scanf("%d",&n);s ='$';len=2*n+1; for(int i=0;i<n;i++) s[2*n-i]=s[i]=get(); make_sa(); int l=0,r=n-1; for(int i=1;i<=n;i++) { if(rank[l]<rank[2*n-r]) putchar(s[l++]);else putchar(s[r--]); if(i%80==0)puts(""); } return 0; }
相关文章推荐
- soj1041. Pushing Boxes
- Life Forms 后缀数组 不小于k个字符串中的最长子串
- suffix array
- bzoj2754 后缀数组
- [POJ2774][后缀数组求LCP]Long Long Message
- 【后缀数组】poj1743Musical Theme
- 字符串匹配:后缀树组模板(关键点理解)
- [PKU2774]Long Long Message
- 后缀数组——罗穗骞倍增算法代码详解
- bzoj 1717: [Usaco2006 Dec] Milk Patterns
- poj 3415 后缀数组+单调队列
- poj 2774 后缀数组模板
- 后缀数组
- Find the maximum subarray XOR in a given array
- poj 3294 后缀数组
- POJ1743 Musical Theme 后缀数组
- 两个字符串的最长公共子串-后缀数组
- POJ 1743 Musical Theme
- POJ 3261 Milk Patterns
- bzoj-3676 回文串