[ACM模板]SuffixArray后缀数组

#include
#include
#include
#include
using namespace std;
class SUFFIXARRAY {
#define SLEN 201000
  /*
    直接用函数.solve(char s[],int charSetSize=128),s[]下标从0开始。
    charSetSize:表示0<=s[0]..s[n-1]n)break;
    f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
    }
  }
int SUFFIXARRAY::getlcp(int l,int r){//后缀 l,和后缀r的lcp
    if (l==r)return n-l+1;
    l=rank[l],r=rank[r];
    if (l>r)swap(l,r);l++;
    int tot=lg[r-l+1];
    return min(f[l][tot],f[r-(1<<(tot))+1][tot]);
  }
void SUFFIXARRAY::build_sa(int m){
    int i, *x = t, *y = t2;
    for(i = 0; i < m; i++) c[i] = 0;
    for(i = 0; i < n; i++) c[x[i] = s[i]]++;
    for(i = 1; i < m; i++) c[i] += c[i-1];
    for(i = n-1; i >= 0; i--) sa[--c[x[i]]] = i;
    for(int k = 1; k <= n; k <<= 1) {
      int p = 0;
      for(i = n-k; i < n; i++) y[p++] = i;
      for(i = 0; i < n; i++) if(sa[i] >= k) y[p++] = sa[i]-k;
      for(i = 0; i < m; i++) c[i] = 0;
      for(i = 0; i < n; i++) c[x[y[i]]]++;
      for(i = 0; i < m; i++) c[i] += c[i-1];
      for(i = n-1; i >= 0; i--) sa[--c[x[y[i]]]] = y[i];
      swap(x, y);
      p = 1; x[sa[0]] = 0;
      for(i = 1; i < n; i++)
        x[sa[i]] = y[sa[i-1]]==y[sa[i]] && y[sa[i-1]+k]==y[sa[i]+k] ? p-1 : p++;
      if(p >= n) break;
      m = p;
    }
  }
void SUFFIXARRAY::clear() {
    n = 0;
    memset(sa, 0, sizeof(sa));
}
void SUFFIXARRAY::solve(char *a,int charSetSize=300){
    n=strlen(a)+1;
    for (int i=0;i=1;i--)rank[i]=rank[i-1];
    initlcp();
  }
SUFFIXARRAY  sa;
char s[SLEN]="abcdefghij";
//s下标从0开始 ,rank[1]表示s[0]开始的后缀
int i,j,k,m,n;
int main(){
scanf("%s",s);
int m=strlen(s);
s[m]=27;
scanf("%s",s+m+1);

n=strlen(s);
sa.solve(s);
int ans=0;
for (i=2;i<=n;i++)
if ((sa.sa[i-1]<=m&&sa.sa[i]>m)||(sa.sa[i-1]>m&&sa.sa[i]<=m))
ans=max(sa.height[i],ans);
cout<
main函数中实现的是:读取两个串,计算最长公共子串。

你可能感兴趣的:(ACM模板)