Lang:G++
Edit12345678910111213141516171819202122232425262728293031/***********TASK:后缀数组LANG:C++数组 值域rank[0~n-1] 1~nsa[1~n] 0~n-1height[2~n] 排名i和排名i-1的后缀的最长公共前缀height[0~1] 无意义***********/#include <cstdio>#include <cstring>#include <algorithm>#define N 200005using namespace std;int wa[N],wb[N],wv[N],ws[N];void da(char *r,int *sa,int n){int i,j,p,*x=wa,*y=wb,m=128;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;for(j=1,p=1;p<n;j*=2,m=p){for(p=0,i=n-j;i<n;i++)y[p++]=i;for(i=0;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j;for(i=0;i<n;i++)wv[i]=x[y[i]];for(i=0;i<m;i++)ws[i]=0;for(i=0;i<n;i++)ws[wv[i]]++;for(i=1;i<m;i++)ws[i]+=ws[i-1];for(i=n-1;i>=0;i--)sa[--ws[wv[i]]]=y[i];for(swap(x,y),p=1,x[sa[0]]=0,i=1;i<n;i++)x[sa[i]]=(y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+j]==y[sa[i]+j])?p-1:p++;