码迷,mamicode.com
首页 > 编程语言 > 详细

后缀数组

时间:2018-08-30 22:11:56      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:cal   std   str   math   space   lib   ring   ==   ++   

https://blog.csdn.net/qq_35640373/article/details/70168683

 1 //hdu 3518
 2 #include <iostream>
 3 #include <string.h>
 4 #include <stdlib.h>
 5 #include <cmath>
 6 #define LL long long
 7 using namespace std;
 8 
 9 #define maxn 1020
10 int max(int x,int y){ return x>y?x:y;}
11 int min(int x,int y){ return x<y?x:y;}
12 int wa[maxn],wb[maxn],wv[maxn],WS[maxn];
13 
14 int cmp(int *r,int a,int b,int l){
15     return r[a]==r[b]&&r[a+l]==r[b+l];
16 }
17 
18 void da(int *r,int *sa,int n,int m){
19     int i,j,p,*x=wa,*y=wb,*t;
20     for(i=0;i<m;i++) WS[i]=0;
21     for(i=0;i<n;i++) WS[x[i]=r[i]]++;
22     for(i=1;i<m;i++) WS[i]+=WS[i-1];
23     for(i=n-1;i>=0;i--) sa[--WS[x[i]]]=i;
24     for(j=1,p=1;p<n;j*=2,m=p){
25         for(p=0,i=n-j;i<n;i++) y[p++]=i;
26         for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
27         for(i=0;i<n;i++) wv[i]=x[y[i]];
28         for(i=0;i<m;i++) WS[i]=0;
29         for(i=0;i<n;i++) WS[wv[i]]++;
30         for(i=1;i<m;i++) WS[i]+=WS[i-1];
31         for(i=n-1;i>=0;i--) sa[--WS[wv[i]]]=y[i];
32         for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)
33             x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
34     }
35     return;
36 }
37 
38 int Rank[maxn],height[maxn];
39 
40 void calheight(int *r,int *sa,int n){
41     int i,j,k=0;
42     for(i=1;i<=n;i++) Rank[sa[i]]=i;
43     for(i=0;i<n;height[Rank[i++]]=k)
44         for(k?k--:0,j=sa[Rank[i]-1];r[i+k]==r[j+k];k++);
45     return;
46 }
47 
48 int r[maxn],sa[maxn];
49 char s[maxn];
50 
51 int ok(int k,int n){
52     int i,j,ret=0;
53     int maxx,minx;
54     maxx=-1;
55     minx=9999999;
56     for(i=1;i<=n;i++){
57         if(height[i]>=k)//分组满足大于k的
58         {
59             maxx=max(maxx,sa[i]);
60             minx=min(minx,sa[i]);
61         }
62         else
63         {
64             if(maxx-minx>=k)//之前满足条件就要+1;
65                 ret++;
66             maxx=sa[i];
67             minx=sa[i];
68         }
69     }
70     if(maxx-minx>=k)
71         ret++;
72     return ret;
73 }
74 
75 int main(){
76     int i,j;
77     while(cin>>s){
78         if(s[0]==#) break;
79         int len=strlen(s);
80         for(i=0;i<len;i++)
81             r[i]=s[i];
82         r[len]=0;
83         da(r,sa,len+1,123);
84         calheight(r,sa,len);
85         LL ans=0;
86         for(i=1;i<len;i++){
87             ans+=ok(i,len);
88         }
89         cout<<ans<<endl;
90     }
91     return 0;
92 }

 

后缀数组

标签:cal   std   str   math   space   lib   ring   ==   ++   

原文地址:https://www.cnblogs.com/jaydenouyang/p/9562917.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!