【POJ 3623】 Best Cow Line, Gold (后缀数组)
【题意】
【分析】
后缀数组水题,嗯,不认真看输出像我一样就会被坑。。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 using namespace std; 8 #define Maxn 300010 9 10 char ss[Maxn],s[Maxn*2]; 11 int a[Maxn*2]; 12 int len,n; 13 14 int Rs[Maxn*2],rk[Maxn*2],sa[Maxn*2],wr[Maxn*2],y[Maxn*2]; 15 void get_sa(int m) 16 { 17 for(int i=1;i<=len;i++) rk[i]=a[i]; 18 for(int i=0;i<=m;i++) Rs[i]=0; 19 for(int i=1;i<=len;i++) Rs[rk[i]]++; 20 for(int i=1;i<=m;i++) Rs[i]+=Rs[i-1]; 21 for(int i=len;i>=1;i--) sa[Rs[rk[i]]--]=i; 22 23 int p=0,ln=1; 24 while(p<len) 25 { 26 int k=0; 27 for(int i=len-ln+1;i<=len;i++) y[++k]=i; 28 for(int i=1;i<=len;i++) if(sa[i]>ln) y[++k]=sa[i]-ln; 29 for(int i=1;i<=len;i++) wr[i]=rk[y[i]]; 30 31 for(int i=0;i<=m;i++) Rs[i]=0; 32 for(int i=1;i<=len;i++) Rs[wr[i]]++; 33 for(int i=1;i<=m;i++) Rs[i]+=Rs[i-1]; 34 for(int i=len;i>=1;i--) sa[Rs[wr[i]]--]=y[i]; 35 36 p=1; 37 for(int i=1;i<=len;i++) wr[i]=rk[i]; 38 for(int i=len+1;i<=len+len;i++) wr[i]=0; 39 rk[sa[1]]=1; 40 for(int i=2;i<=len;i++) 41 { 42 if(wr[sa[i]]!=wr[sa[i-1]]||wr[sa[i]+ln]!=wr[sa[i-1]+ln]) p++; 43 rk[sa[i]]=p; 44 } 45 m=p,ln*=2; 46 } 47 } 48 49 /*int height[Maxn]; 50 void get_height() 51 { 52 int k=0; 53 for(int i=1;i<=len;i++) if(sa[i]!=1) 54 { 55 int j=sa[rk[i]-1]; 56 if(k) k--; 57 while(a[i+k]==a[j+k]) k++; 58 height[rk[i]]=k; 59 } 60 }*/ 61 62 int ans[Maxn]; 63 64 int main() 65 { 66 scanf("%d",&n); 67 for(int i=1;i<=n;i++) 68 { 69 scanf("%s",s); 70 a[i]=s[0]-'A'+1; 71 } 72 // ans[n+1]=28; 73 len=2*n; 74 for(int i=1;i<=n;i++) a[len-i+1]=a[i]; 75 get_sa(30); 76 // get_height(); 77 int l=1,r=n; 78 for(int i=1;i<=n;i++) 79 { 80 if(rk[l]<=rk[len-r+1]) ans[i]=a[l++]; 81 else ans[i]=a[r--]; 82 } 83 for(int i=1;i<=n;i++) 84 { 85 printf("%c",ans[i]+'A'-1); 86 if(i%80==0) printf("\n"); 87 } 88 printf("\n"); 89 return 0; 90 }
坑爹的poj改数据规模也不说一声。。
2016-11-03 09:52:49