aaaa ababcabb aaaaaa #
2 3 3
//62MS 284K #include<stdio.h> #include<string.h> #include<algorithm> #define M 500007 #define inf 0x3f3f3f using namespace std; int sa[M],rank[M],height[M]; int wa[M],wb[M],wv[M],ws[M]; char str[1007]; int num[1007]; int cmp(int *r,int a,int b,int l) { return r[a]==r[b]&&r[a+l]==r[b+l]; } void get_sa(int *r,int n,int m) { 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; 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(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; } } void get_height(int *r,int n) { int i,j,k=0; for(i=1;i<=n;i++)rank[sa[i]]=i; for(i=0;i<n;height[rank[i++]]=k) for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++); } int solve(int k,int n) { int maxx=0,minn=inf,ans=0; for(int i=1;i<=n;i++) if(height[i]<k) { if(maxx-minn>=k) { ans++; //printf("%d %d\n",maxx,minn); } maxx=0,minn=inf; } else { maxx=max(max(sa[i-1],sa[i]),maxx); minn=min(min(sa[i-1],sa[i]),minn); } if(maxx-minn>=k)ans++; return ans; } int main() { while(scanf("%s",str),str[0]!=‘#‘) { int n=strlen(str); for(int i=0;i<n;i++) num[i]=str[i]-‘a‘+1; num[n]=0; int ans=0,m=30; get_sa(num,n+1,m); get_height(num,n); //for(int i=0;i<=n;i++) // printf("i==%d,sa==%d,height==%d\n",i,sa[i],height[i]); for(int i=1;i<=n/2;i++) ans+=solve(i,n); printf("%d\n",ans); } return 0; }
HDU 3518 Boring counting 重复出现不重叠子串个数(后缀数组),布布扣,bubuko.com
HDU 3518 Boring counting 重复出现不重叠子串个数(后缀数组)
原文:http://blog.csdn.net/crescent__moon/article/details/23029479