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.调用

    ..

  • 相关阅读:
    fzuoj Problem 2177 ytaaa
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Capture the Flag
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Team Formation
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Beauty of Array
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Lunch Time
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Convert QWERTY to Dvorak
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest May Day Holiday
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Demacia of the Ancients
    zjuoj The 12th Zhejiang Provincial Collegiate Programming Contest Ace of Aces
    csuoj 1335: 高桥和低桥
  • 原文地址:https://www.cnblogs.com/julyc/p/5726054.html
Copyright © 2011-2022 走看看