n<1000,最後查詢的時候可以用n^2算法,如果是10000就不行了
#include#include #include using namespace std; typedef long long ll; #define N 1005 char s[N]; int r[N]; int wa[N],wb[N],wv[N],ws[N],Rank[N],sa[N],height[N]; int cmp(int *r,int a,int b,int l){ return r[a]==r[b]&&r[a+l]==r[b+l]; } void da(int *r,int *sa,int n,int m){ int i,j,p,*x=wa,*y=wb; for(i=0;i =0;i--) sa[--ws[x[i]]]=i; for(j=1,p=1;p =j) y[p++]=sa[i]-j; for(i=0;i =0;i--) sa[--ws[wv[i]]]=y[i]; swap(x,y); for(p=1,x[sa[0]]=0,i=1;i =len &&i<=l){//注意i>l的時候要跳出循環,不然會由於上一個數據引起錯誤 if(sa[i] maxi) maxi=sa[i]; i++; } if(maxi-mini>=len) ans++; mini=sa[i]; maxi=sa[i]; } } printf("%I64d\n",ans); } return 0; }