后缀数组背诵用模板

    xiaoxiao2021-03-25  144

    原理很简单,但是看代码学习实在是太慢了、

    花了4个小时、 

    bool cmp(int *y,int a,int b,int k)

      {   int aa=y[a],bb=y[b],aaaa=y[a]+k,bbbb=y[b]+k;   if(aaaa>=len)aaaa=-1;   if(bbbb>=len)bbbb=-1;   return aa==bb&&aaaa==bbbb;     } void da()  {   int *x=t1,*y=t2;   m=26;   for(i=0;i<m;i++)cc[i]=0;   for(i=0;i<len;i++)cc[x[i]=str[i]-'a']++;   for(i=1;i<m;i++)cc[i]+=cc[i-1];            for(i=len-1;i>=0;i--)sa[--cc[x[i]]]=i;           for(k=1;k<=len;k<<=1) { p=0; for(i=len-k;i<len;i++)y[p++]=i; for(i=0;i<len;i++)if(sa[i]>=k)y[p++]=sa[i]-k; for(i=0;i<m;i++)cc[i]=0; for(i=0;i<len;i++)cc[x[y[i]]]++; for(i=1;i<m;i++)cc[i]+=cc[i-1];    for(i=len-1;i>=0;i--)sa[--cc[x[y[i]]]]=y[i];        m=1;    swap(x,y);x[sa[0]]=0;    for(i=1;i<len;i++)      x[sa[i]]=cmp(y,sa[i],sa[i-1],k)?m-1:m++; if(m>=len)break; }   }   void calcheight() { for(i=0;i<len;i++)rank[sa[i]]=i; height[0]=0; int k=0; for(i=0;i<len;i++) { if(!rank[i])continue; int j=sa[rank[i]-1]; if(k)--k; while(str[i+k]==str[j+k])++k; height[rank[i]]=k; } } 
    转载请注明原文地址: https://ju.6miu.com/read-8201.html

    最新回复(0)