后缀数组模板一份
2014-05-29 20:27
246 查看
1 /******************
2 by zhuyuqi *
3 QQ:1113865149 *
4 name:2-sat *
5 *
6 ******************/
7
8 using namespace std;
9 const int MAX = 1000;
int r[MAX],*rank;
int wa[MAX],wb[MAX],ws[MAX],wv[MAX];
int height[MAX];
char str[MAX];
int cmp(int *r,int a,int b,int d) {
return r[a]==r[b]&&r[a+d]==r[b+d];
}
void build_sa(int *r,int *sa,int n,int m) {
int *x=wa,*y=wb,*t;
for(int i=0;i<m;i++) ws[i]=0;
for(int i=0;i<n;i++) ws[x[i]=r[i]]++;
for(int i=1;i<m;i++) ws[i]+=ws[i-1];
for(int i=0,j=1,p=1;p<n;j*=2,m=p) {
for(i=n-j,p=0;i<n;i++) y[p++]=i;
for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=0;i<n;i++) wv[i]=x[y[i]];
for(i=0;i<m;i++) ws[i]=0;
for(i=0;i<n;i++) ws[wv[i]]++;
for(i=1;i<m;i++) ws[i]+=ws[i-1];
for(i=n-1;i>=0;i--) sa[--ws[wv[i]]] = y[i];
for(p=1,i=1,t=x,x=y,y=t,x[sa[0]]=0;i<n;i++)
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
}
return ;
}
void getHight(int *r,int *sa,int n) { //two - point
int h=0;
for(int i=0;i<n;i++) rank[sa[i]]=i;
for(int i=0;i<n;i++) {
if(h) h--;
int j=sa[rank[i]-1];
while(str[i+h]==str[j+h]) h++;
height[rank[i]]=h;
}
}
int main() {
}
2 by zhuyuqi *
3 QQ:1113865149 *
4 name:2-sat *
5 *
6 ******************/
7
8 using namespace std;
9 const int MAX = 1000;
int r[MAX],*rank;
int wa[MAX],wb[MAX],ws[MAX],wv[MAX];
int height[MAX];
char str[MAX];
int cmp(int *r,int a,int b,int d) {
return r[a]==r[b]&&r[a+d]==r[b+d];
}
void build_sa(int *r,int *sa,int n,int m) {
int *x=wa,*y=wb,*t;
for(int i=0;i<m;i++) ws[i]=0;
for(int i=0;i<n;i++) ws[x[i]=r[i]]++;
for(int i=1;i<m;i++) ws[i]+=ws[i-1];
for(int i=0,j=1,p=1;p<n;j*=2,m=p) {
for(i=n-j,p=0;i<n;i++) y[p++]=i;
for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=0;i<n;i++) wv[i]=x[y[i]];
for(i=0;i<m;i++) ws[i]=0;
for(i=0;i<n;i++) ws[wv[i]]++;
for(i=1;i<m;i++) ws[i]+=ws[i-1];
for(i=n-1;i>=0;i--) sa[--ws[wv[i]]] = y[i];
for(p=1,i=1,t=x,x=y,y=t,x[sa[0]]=0;i<n;i++)
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
}
return ;
}
void getHight(int *r,int *sa,int n) { //two - point
int h=0;
for(int i=0;i<n;i++) rank[sa[i]]=i;
for(int i=0;i<n;i++) {
if(h) h--;
int j=sa[rank[i]-1];
while(str[i+h]==str[j+h]) h++;
height[rank[i]]=h;
}
}
int main() {
}
相关文章推荐
- 【BZOJ 1031】[JSOI2007]字符加密Cipher(后缀数组模板)
- 后缀数组模板
- 邝斌的ACM模板(后缀数组)
- [模板]后缀数组
- 后缀数组模板
- 后缀数组解决在线的多模板匹配问题
- 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message
- 后缀数组模板
- 后缀数组(suffix array) 模板(1)
- 后缀数组-倍增发(模板)
- 后缀数组罗穗蹇模板(dc3)
- 后缀数组模板第一版
- PKU 2774 Long Long Message (后缀数组练习模板题)
- 后缀数组模板
- 后缀数组 倍增算法模板
- POJ 2774 Long Long Message (后缀数组模板)
- 【后缀数组】关于后缀数组模板的注解
- 后缀数组小模板 POJ 2774
- UOJ #35. BZOJ 1031 后缀排序 后缀数组模板
- 后缀数组(suffix array)模板(2)