【bzoj1031】[JSOI2007]字符加密Cipher

只要求sa

 1 #include<algorithm>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 using namespace std;
 7  
 8 #define N 200010
 9  
10 int wa[N],wb[N],ws[N],wv[N];
11 int sa[N],r[N];
12 char str[N],s[N];
13  
14 int m;
15  
16 int cmp(int *r,int a,int b,int l)
17 {
18     return r[a]==r[b] && r[a+l]==r[b+l];
19 }
20  
21 void da(int *r,int n,int m)
22 {
23     int i,j,p,*x=wa,*y=wb,*t;
24     for (i=0;i<m;i++) ws[i]=0;
25     for (i=0;i<n;i++) ws[x[i]=r[i]]++;
26     for (i=1;i<m;i++) ws[i]+=ws[i-1];
27     for (i=n-1;i>=0;i--) sa[--ws[x[i]]]=i;
28     for (j=1,p=1;p<n;j*=2,m=p)
29     {
30         for (p=0,i=n-j;i<n;i++) y[p++]=i;
31         for (i=0;i<n;i++) if (sa[i]>=j) y[p++]=sa[i]-j;
32         for (i=0;i<n;i++) wv[i]=x[y[i]];
33         for (i=0;i<m;i++) ws[i]=0;
34         for (i=0;i<n;i++) ws[wv[i]]++;
35         for (i=1;i<m;i++) ws[i]+=ws[i-1];
36         for (i=n-1;i>=0;i--) sa[--ws[wv[i]]]=y[i];
37         for (t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)
38             x[sa[i]]=cmp(y,sa[i-1],sa[i],j) ? p-1 : p++;
39     }
40     return ;
41 }
42  
43 int main()
44 {
45     scanf("%s",str);
46     strcat(s,str);
47     strcat(s,str);
48     int n=strlen(s);
49     s[n]=1;
50     for (int i=0;i<=n;i++)
51      {
52          r[i]=s[i];
53          if (r[i]>m)
54              m=r[i];
55      }
56     for (int i=0;i<=n;i++)
57     {
58         r[i]=s[i];
59         m=max(m,r[i]);
60     }
61     int l=strlen(str);
62     da(r,n+1,m+1);
63     for (int i=0;i<=n;i++)
64         if (sa[i]<l)
65             printf("%c",s[sa[i]+l-1]);
66     return 0;
67 }

 

posted @ 2016-04-08 21:28  Yangjiyuan  阅读(138)  评论(0编辑  收藏  举报