后缀数组模板~~~

int n,k;
int sa[MaxN+10],rank[MaxN+10],tmp[MaxN+10],height[MaxN+10];
bool compare_sa(int i,int j){
	 if(rank[i] != rank[j] )return rank[i] < rank[j];
	 else{
  	 	 int ri = i + k <= n ? rank[i+k] : -1; 
  	 	 int rj = j + k <= n ? rank[j+k] : -1;
		 return ri < rj;	 
     }	 
}
void construct_sa(char *s,int *sa){
	 n = strlen(s);
	 repf(i,0,n){sa[i]=i;rank[i]=i<n?s[i]:-1;}
	 for(k=1;k<=n;k*=2){
		sort(sa,sa+n+1,compare_sa);
		
		tmp[sa[0]] = 0;
		repf(i,1,n) tmp[sa[i]]=tmp[sa[i-1]] + (compare_sa(sa[i-1],sa[i])?1:0);
		repf(i,0,n) rank[i]=tmp[i];
	 }
}
void construct_lcp(char *s,int *sa,int *lcp){
	  n=strlen(s);
	 repd(i,n)rank[sa[i]] = i;
	 int h=0;
	 lcp[0]=0;
	 rep(i,n){
  	    int  j =sa[rank[i] -1];
  	    
  	    if(h>0) h--;
  	    for(;j+h<n&&i+h<n;h++) if(s[j+h]!=s[i+h])break;
  	    
  	    lcp[rank[i]-1] = h;
  	 }
}

  模板题目 : POJ 2774 与2217~~~拼接两个字符串,求出lcp~~分别属于两个字符串的sa[i] 与sa[i+1]的最大height为最长公共子串~~~

原文地址:https://www.cnblogs.com/UnkelTao/p/3361132.html