• 后缀数组模板一份


     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 }
  • 相关阅读:
    【SqlServer系列】表达式(expression)
    【SqlServer系列】语法定义符号解析
    Docker常用命令<转>
    VMware下的Centos7联网并设置固定IP
    redis的setbit命令
    Java并发编程:并发容器之CopyOnWriteArrayList<转>
    Java并发编程:volatile关键字解析<转>
    Java并发编程:阻塞队列 <转>
    Java并发编程:Lock和Synchronized <转>
    Jackson学习笔记(三)<转>
  • 原文地址:https://www.cnblogs.com/acvc/p/3759976.html
Copyright © 2020-2023  润新知