Lang:G++
Edit12345678910111213141516171819202122232425262728293031#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<vector>#include<algorithm>using namespace std;const int N = 100000+50;int cmp(int *r,int a,int b,int l){return (r[a]==r[b]) && (r[a+l]==r[b+l]);}// 用于比较第一关键字与第二关键字,// 比较特殊的地方是,预处理的时候,r[n]=0(小于前面出现过的字符)/*DA(aa,sa,n+1,200);calheight(aa,sa,n);*/int wa[N],wb[N],ws[N],wv[N];int Rank[N];//后缀i在sa[]中的排名int height[N];//sa[i]与sa[i-1]的LCPint sa[N];//sa[i]表示排名第i小的后缀的下标void DA(int *r,int *sa,int n,int m) //此处N比输入的N要多1,为人工添加的一个字符,用于避免CMP时越界{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; //预处理长度为1for(j=1,p=1; p<n; j*=2,m=p) //通过已经求出的长度J的SA,来求2*J的SA{