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

    后缀数组模板 SuffixArray

     1 #include<bits/stdc++.h>
     2 #define rep(i,a,b) for(i=a;i<b;++i)
     3 #define drep(i,a,b) for(i=b;i>=a;--i)
     4 using namespace std;
     5 int p[N],wc[N],wv[N],wa[N],wb[N],rank[N],sa[N];
     6 char s[N];
     7 inline bool cmp(int *r,int a,int b,int l) {
     8     return r[a]==r[b]&&r[a+l]==r[b+l];
     9 }
    10 inline void tate(int *x,int *y,char *r,int n,int m,bool opt) {
    11     int i;
    12     rep(i,0,m) wc[i]=0;
    13     rep(i,0,n) wc[opt?(x[i]=r[i]):wv[i]]++;
    14     rep(i,1,m) wc[i]+=wc[i-1];
    15     drep(i,n-1,0) sa[--wc[opt?x[i]:wv[i]]]=opt?i:y[i];
    16 }
    17 void f(char *r,int *sa,int n,int m) {
    18     int i,j,p,*x=wa,*y=wb,*t;
    19     tate(x,y,r,n,m,1);
    20     for (j=1,p=1;p<n;j<<=1,m=p) {
    21         p=0;
    22         rep(i,n-j,n) y[p++]=i;
    23         rep(i,0,n) if(sa[i]>=j) y[p++]=sa[i]-j;
    24         rep(i,0,n) wv[i]=x[y[i]];
    25         tate(x,y,r,n,m,0);
    26         for (t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;++i)
    27             x[sa[i]]=cmp(r,sa[i-1],sa[i],j)?p-1:p++;
    28     }
    29 }

    压了下,把基数排序的压进函数,然后看起来还挺好写的,这只是后缀数组的一个阶段啦, 继续努力!

  • 相关阅读:
    前中后序建立树或者直接历遍
    Leetcode:面试题 04.03. 特定深度节点链表
    按层数层序历遍
    Solidity函数修饰符
    无线传感网定位技术
    无线传感器网络概述,传感器网络结构
    Solidity高级用法
    智能合约交互
    内存
    CPU的态
  • 原文地址:https://www.cnblogs.com/TonyNeal/p/SuffixArray1.html
Copyright © 2011-2022 走看看