后缀数组_DC3(模板大全)

/*
suffix数组:第i位到最后的字符串
sa数组:将排序后的后缀的开头位置顺次放入SA中,称为后缀数组
rank数组:令rank[i]保存suffix[i]在排序中的名次,名次数组
*/
#include "stdio.h"
#include "string.h"
#define maxn 20004
#define maxm 1000005

#define F(x) ((x)/3+((x)%3==1?0:tb))
#define G(x) ((x)=0;i--) b[--ws[wv[i]]]=a[i];
     return;
}
void dc3(int *r,int *sa,int n,int m)
{
     int i,j,*rn=r+n,*san=sa+n,ta=0,tb=(n+1)/3,tbc=0,p;
     r[n]=r[n+1]=0;
     for(i=0;ib) {t=a;a=b;b=t;}
    return(height[askRMQ(a+1,b)]);
}
/*
*/
char st[maxn];
int r[maxn*3],sa[maxn*3];
/*求最长回文长
int main()
{
    int i,n,len,k,ans=0,w;
    scanf("%s",st);
    len=strlen(st);
    for(i=0;ians) ans=k*2,w=i-k;
      k=lcp(i,n-i-1);
      if(k*2-1>ans) ans=k*2-1,w=i-k+1;
    }
    st[w+ans]=0;
    printf("%s\n",st+w);
    return 0;
}*/
/*求最大公共字串长
int main()
{
    int i,j,n,ans=0;
    scanf("%s",st);
    j=strlen(st);
    st[j]=1;
    scanf("%s",st+j+1);
    n=strlen(st);
    for(i=0;ians)
    if((jsa[i])
    || (j>sa[i-1] && jmax) max=sa[i];
        if(max-min>k) return(1);
      }
    }
    return(0);
}
int main()
{
    int i,j=0,k,n;
    int min,mid,max;
    scanf("%d",&n);
    while(n!=0)
    {
      n--;
      for(i=0;i=4) printf("%d\n",max+1);
      else printf("0\n");
      scanf("%d",&n);
    }
    return 0;
}
*/
/*
可重叠的 k 次最长重复子串
给定一个长度为n的整数序列,求其中至少出现k次的子序列长度最长为多长
int check(int n,int k,int mid)
{
    int i,s=1;
    for(i=1;i<=n;i++)
    if(height[i]>=mid)
    {
      s++;
      if(s>=k) return(1);
    }
    else s=1;
    return(0);
}
int main()
{
    int i,k,n;
    int min,mid,max;
    scanf("%d %d",&n,&k);
    for(i=0;i0)
    {
      scanf("%s",st);
      n=strlen(st);
      for(i=0;i=a[c])
        {
          ss-=(long long)(a[c-1]-a[c])*b[c-1];
          a[c-1]=a[c];
          b[c-1]+=b[c];
          c--;
        }
      }
      printf("%I64d\n",ans);
      scanf("%d",&k);
    }
    return 0;
}
*/


你可能感兴趣的:(ACM,数据结构)