首页 > 代码库 > 后缀数组模板一份
后缀数组模板一份
1 /******************
2 by zhuyuqi *
3 QQ:1113865149 *
4 name:2-sat *
5 *
6 ******************/
7
8 using namespace std;
9 const int MAX = 1000;
10 int r[MAX],*rank;
11 int wa[MAX],wb[MAX],ws[MAX],wv[MAX];
12 int height[MAX];
13 char str[MAX];
14 int cmp(int *r,int a,int b,int d) {
15 return r[a]==r[b]&&r[a+d]==r[b+d];
16 }
17
18 void build_sa(int *r,int *sa,int n,int m) {
19 int *x=wa,*y=wb,*t;
20 for(int i=0;i<m;i++) ws[i]=0;
21 for(int i=0;i<n;i++) ws[x[i]=r[i]]++;
22 for(int i=1;i<m;i++) ws[i]+=ws[i-1];
23
24 for(int i=0,j=1,p=1;p<n;j*=2,m=p) {
25 for(i=n-j,p=0;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
29 for(i=0;i<m;i++) ws[i]=0;
30 for(i=0;i<n;i++) ws[wv[i]]++;
31 for(i=1;i<m;i++) ws[i]+=ws[i-1];
32 for(i=n-1;i>=0;i--) sa[--ws[wv[i]]] = y[i];
33
34 for(p=1,i=1,t=x,x=y,y=t,x[sa[0]]=0;i<n;i++)
35 x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
36
37
38 }
39
40 return ;
41 }
42
43 void getHight(int *r,int *sa,int n) { //two - point
44 int h=0;
45 for(int i=0;i<n;i++) rank[sa[i]]=i;
46 for(int i=0;i<n;i++) {
47 if(h) h--;
48 int j=sa[rank[i]-1];
49 while(str[i+h]==str[j+h]) h++;
50 height[rank[i]]=h;
51 }
52 }
53
54 int main() {
55 }
2 by zhuyuqi *
3 QQ:1113865149 *
4 name:2-sat *
5 *
6 ******************/
7
8 using namespace std;
9 const int MAX = 1000;
10 int r[MAX],*rank;
11 int wa[MAX],wb[MAX],ws[MAX],wv[MAX];
12 int height[MAX];
13 char str[MAX];
14 int cmp(int *r,int a,int b,int d) {
15 return r[a]==r[b]&&r[a+d]==r[b+d];
16 }
17
18 void build_sa(int *r,int *sa,int n,int m) {
19 int *x=wa,*y=wb,*t;
20 for(int i=0;i<m;i++) ws[i]=0;
21 for(int i=0;i<n;i++) ws[x[i]=r[i]]++;
22 for(int i=1;i<m;i++) ws[i]+=ws[i-1];
23
24 for(int i=0,j=1,p=1;p<n;j*=2,m=p) {
25 for(i=n-j,p=0;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
29 for(i=0;i<m;i++) ws[i]=0;
30 for(i=0;i<n;i++) ws[wv[i]]++;
31 for(i=1;i<m;i++) ws[i]+=ws[i-1];
32 for(i=n-1;i>=0;i--) sa[--ws[wv[i]]] = y[i];
33
34 for(p=1,i=1,t=x,x=y,y=t,x[sa[0]]=0;i<n;i++)
35 x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
36
37
38 }
39
40 return ;
41 }
42
43 void getHight(int *r,int *sa,int n) { //two - point
44 int h=0;
45 for(int i=0;i<n;i++) rank[sa[i]]=i;
46 for(int i=0;i<n;i++) {
47 if(h) h--;
48 int j=sa[rank[i]-1];
49 while(str[i+h]==str[j+h]) h++;
50 height[rank[i]]=h;
51 }
52 }
53
54 int main() {
55 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。