IOI2009论文

reference:http://www.cnblogs.com/staginner/archive/2012/02/02/2335600.html

 

先上个不带注释直接用的版本:

 1 //在BT5下attack的时候把数值调大点(超过2000)就行了,具体可以参见网上破解无线网密码的文章,就是抓包之后的那步,注入数据包的命令
 2 int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
 3 int rank[maxn],height[maxn];
 4 int r[maxn],sa[maxn],ans[maxn];
 5 int n;
 6 
 7 
 8 int cmp(int *r,int a,int b,int l)
 9 {
10     return r[a]==r[b]&&r[a+l]==r[b+l];
11 }
12 
13 void da(int *r,int *sa,int n,int m)
14 {
15     int i,j,p,*x=wa,*y=wb,*t;
16     for(i=0; i<m; i++) ws[i]=0;
17     for(i=0; i<n; i++) ws[x[i]=r[i]]++;
18     for(i=1; i<m; i++) ws[i]+=ws[i-1];
19     for(i=n-1; i>=0; i--) sa[--ws[x[i]]]=i;
20     for(j=1,p=1; p<n; j*=2,m=p)
21     {
22 
23         for(p=0,i=n-j; i<n; i++) y[p++]=i;
24         for(i=0; i<n; i++) if(sa[i]>=j) y[p++]=sa[i]-j;
25         for(i=0; i<n; i++) wv[i]=x[y[i]];
26         for(i=0; i<m; i++) ws[i]=0;
27         for(i=0; i<n; i++) ws[wv[i]]++;
28         for(i=1; i<m; i++) ws[i]+=ws[i-1];
29         for(i=n-1; i>=0; i--) sa[--ws[wv[i]]]=y[i];
30         for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1; i<n; i++)
31             x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
32     }
33     return;
34 }
35 
36 void calheight(int *r,int *sa,int n)
37 {
38     int i,j,k=0;
39     for(i=1; i<=n; i++) rank[sa[i]]=i;
40     for(i=0; i<n; height[rank[i++]]=k)
41         for(k?k--:0,j=sa[rank[i]-1]; r[i+k]==r[j+k]; k++);
42     return;
43 }
44 
45 int main()
46 {
47     for (int i=0; i<n; i++)
48         scanf("%d",&r[i]);
49     r[n]=0;
50 
51     da(r,sa,n+1,200);
52     calheight(r,sa,n);
53 
54     //TODO: Please Code Here
55 
56 
57 }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-06-23
  • 2021-11-04
猜你喜欢
  • 2022-12-23
  • 2021-08-12
  • 2022-02-04
相关资源
相似解决方案