标签:
按照惯例,先上模板:
char s[maxn]; int sa[maxn],t[maxn],t2[maxn],c[maxn],n; void 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[p--c[x[i]]]=i; for(int k=1;k<=n;k<<=1){ int p=0; for(int i=n-k;i<n;i++) y[p++]=i; 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[--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; } } int m; int cmp_suffix(char *pattern,int p) { return strncmp(pattern,s+sa[p].m); } int find(char *P) { m=strlen(P); if(cmp_suffix(P,0)<0) return -1; if(cmp_suffix(P,n-1)>0) return -1; int L=0,R=n-1; while(R>=L){ int M=L+(R-L)/2; int res=cmp_suffix(P,M); if(!res) return M; if(res<0) R=M-1; else L=M+1; } return -1; }
标签:
原文地址:http://www.cnblogs.com/--560/p/4727537.html