【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 }
View Code

 

坑爹的poj改数据规模也不说一声。。

 

2016-11-03 09:52:49

posted @ 2016-11-03 09:48  konjak魔芋  阅读(332)  评论(0编辑  收藏  举报