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

    1.dc

    #define maxn 1000001
    int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
    int cmp(int *r,int a,int b,int l)
    {return r[a]==r[b]&&r[a+l]==r[b+l];}
    void da(int *r,int *sa,int n,int m)
    {
         int i,j,p,*x=wa,*y=wb,*t;
         for(i=0;i<m;i++) ws[i]=0;
         for(i=0;i<n;i++) ws[x[i]=r[i]]++;
         for(i=1;i<m;i++) ws[i]+=ws[i-1];
         for(i=n-1;i>=0;i--) sa[--ws[x[i]]]=i;
         for(j=1,p=1;p<n;j*=2,m=p)
         {
           for(p=0,i=n-j;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(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)
           x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
         }
         return;
    }
    int rank[maxn],height[maxn];
    void calheight(int *r,int *sa,int n)
    {
         int i,j,k=0;
         for(i=1;i<=n;i++) rank[sa[i]]=i;
         for(i=0;i<n;height[rank[i++]]=k)
         for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);
         return;
    }
    int RMQ[maxn];
    int mm[maxn];
    int best[20][maxn];
    void initRMQ(int n)
    {
         int i,j,a,b;
         for(mm[0]=-1,i=1;i<=n;i++)
         mm[i]=((i&(i-1))==0)?mm[i-1]+1:mm[i-1];
         for(i=1;i<=n;i++) best[0][i]=i;
         for(i=1;i<=mm[n];i++)
         for(j=1;j<=n+1-(1<<i);j++)
         {
           a=best[i-1][j];
           b=best[i-1][j+(1<<(i-1))];
           if(RMQ[a]<RMQ[b]) best[i][j]=a;
           else best[i][j]=b;
         }
         return;
    }
    int askRMQ(int a,int b)
    {
        int t;
        t=mm[b-a+1];b-=(1<<t)-1;
        a=best[t][a];b=best[t][b];
        return RMQ[a]<RMQ[b]?a:b;
    }
    int lcp(int a,int b)
    {
        int t;
        a=rank[a];b=rank[b];
        if(a>b) {t=a;a=b;b=t;}
        return(height[askRMQ(a+1,b)]);
    }

    2.dc3

     1 #define maxn 1000003
     2 #define F(x) ((x)/3+((x)%3==1?0:tb))
     3 #define G(x) ((x)<tb?(x)*3+1:((x)-tb)*3+2)
     4 int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
     5 int c0(int *r,int a,int b)
     6 {return r[a]==r[b]&&r[a+1]==r[b+1]&&r[a+2]==r[b+2];}
     7 int c12(int k,int *r,int a,int b)
     8 {if(k==2) return r[a]<r[b]||r[a]==r[b]&&c12(1,r,a+1,b+1);
     9  else return r[a]<r[b]||r[a]==r[b]&&wv[a+1]<wv[b+1];}
    10 void sort(int *r,int *a,int *b,int n,int m)
    11 {
    12      int i;
    13      for(i=0;i<n;i++) wv[i]=r[a[i]];
    14      for(i=0;i<m;i++) ws[i]=0;
    15      for(i=0;i<n;i++) ws[wv[i]]++;
    16      for(i=1;i<m;i++) ws[i]+=ws[i-1];
    17      for(i=n-1;i>=0;i--) b[--ws[wv[i]]]=a[i];
    18      return;
    19 }
    20 void dc3(int *r,int *sa,int n,int m)
    21 {
    22      int i,j,*rn=r+n,*san=sa+n,ta=0,tb=(n+1)/3,tbc=0,p;
    23      r[n]=r[n+1]=0;
    24      for(i=0;i<n;i++) if(i%3!=0) wa[tbc++]=i;
    25      sort(r+2,wa,wb,tbc,m);
    26      sort(r+1,wb,wa,tbc,m);
    27      sort(r,wa,wb,tbc,m);
    28      for(p=1,rn[F(wb[0])]=0,i=1;i<tbc;i++)
    29      rn[F(wb[i])]=c0(r,wb[i-1],wb[i])?p-1:p++;
    30      if(p<tbc) dc3(rn,san,tbc,p);
    31      else for(i=0;i<tbc;i++) san[rn[i]]=i;
    32      for(i=0;i<tbc;i++) if(san[i]<tb) wb[ta++]=san[i]*3;
    33      if(n%3==1) wb[ta++]=n-1;
    34      sort(r,wb,wa,ta,m);
    35      for(i=0;i<tbc;i++) wv[wb[i]=G(san[i])]=i;
    36      for(i=0,j=0,p=0;i<ta && j<tbc;p++)
    37      sa[p]=c12(wb[j]%3,r,wa[i],wb[j])?wa[i++]:wb[j++];
    38      for(;i<ta;p++) sa[p]=wa[i++];
    39      for(;j<tbc;p++) sa[p]=wb[j++];
    40      return;
    41 }
    42 int rank[maxn],height[maxn];
    43 void calheight(int *r,int *sa,int n)
    44 {
    45      int i,j,k=0;
    46      for(i=1;i<=n;i++) rank[sa[i]]=i;
    47      for(i=0;i<n;height[rank[i++]]=k)
    48      for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);
    49      return;
    50 }
    51 int RMQ[maxn];
    52 int mm[maxn];
    53 int best[20][maxn];
    54 void initRMQ(int n)
    55 {
    56      int i,j,a,b;
    57      for(mm[0]=-1,i=1;i<=n;i++)
    58      mm[i]=((i&(i-1))==0)?mm[i-1]+1:mm[i-1];
    59      for(i=1;i<=n;i++) best[0][i]=i;
    60      for(i=1;i<=mm[n];i++)
    61      for(j=1;j<=n+1-(1<<i);j++)
    62      {
    63        a=best[i-1][j];
    64        b=best[i-1][j+(1<<(i-1))];
    65        if(RMQ[a]<RMQ[b]) best[i][j]=a;
    66        else best[i][j]=b;
    67      }
    68      return;
    69 }
    70 int askRMQ(int a,int b)
    71 {
    72     int t;
    73     t=mm[b-a+1];b-=(1<<t)-1;
    74     a=best[t][a];b=best[t][b];
    75     return RMQ[a]<RMQ[b]?a:b;
    76 }
    77 int lcp(int a,int b)
    78 {
    79     int t;
    80     a=rank[a];b=rank[b];
    81     if(a>b) {t=a;a=b;b=t;}
    82     return(height[askRMQ(a+1,b)]);
    83 }
    View Code

    3.调用

    ..

  • 相关阅读:
    (转)【web前端培训之前后端的配合(中)】继续昨日的故事
    ural(Timus) 1136. Parliament
    scau Josephus Problem
    ACMICPC Live Archive 6204 Poker End Games
    uva 10391 Compound Words
    ACMICPC Live Archive 3222 Joke with Turtles
    uva 10132 File Fragmentation
    uva 270 Lining Up
    【转】各种字符串哈希函数比较
    uva 10905 Children's Game
  • 原文地址:https://www.cnblogs.com/julyc/p/5726054.html
Copyright © 2011-2022 走看看