zoukankan      html  css  js  c++  java
  • 后缀数组模板一份

     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 }
  • 相关阅读:
    理解C++类 this 指针的例子
    C++ const修饰符
    C++遍历循环多维数组
    C++ begin()和end()
    动态规划——最大子串和
    matlab 和 origin作图去除白边,字体调节
    求字符串中的某个子串重复次数
    mysql的 join联合查询的通俗解释
    java正则表达式常用实例——借鉴思路
    注册表的简单使用
  • 原文地址:https://www.cnblogs.com/acvc/p/3759976.html
Copyright © 2011-2022 走看看