1#include <cstdio>2#include <cstring>3 using namespacestd;4 Chara[250000],b[110000];5 intsa[250000],x[250000],wv[250000],ws[250000],h[250000],rank[250000],wa[250000],wb[250000];6 intcmpint*r,intAintBintL) {return(R[a]==r[b]) && (r[a+l]==r[b+l]);}7 voidCalheight (intNint*rank)8 {9 inti,j,k=0;Ten for(i=0; i<n;h[rank[i++]]=k) One for(k?k--:0, j=sa[rank[i]-1];a[i+k]==a[j+k];k++); A } - voidDA (Char*r,int*sa,intNintm) - { the inti,j,k,*x=wa,*y=wb,*t,p; - 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) + { A for(p=0, i=n-j;i<n;i++) y[p++]=i; at 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]; in 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)? p1:p + +; to } + calheight (n,x); - } the intMain () * { $ intLa,lb,f_b,f_e,s_b,s_e,max,i,n;Panax Notoginsengscanf"%s", a); -La=strlen (a); thescanf"\ n"); +scanf"%s", b); Alb=strlen (b); thef_b=0; +f_e=la-1; -a[la]='#'; $s_b=LA; $ for(i=0; i<lb;i++) a[++la]=B[i]; -S_e=LA; -a[la+1]=0; theDA (a,sa,la+1, the); - //calheight (la+1);Wuyimax=-0x7fffffff; the for(i=2; i<=la;i++) - { Wu if(h[i]>max&& (sa[i]>=f_b&&sa[i]<=f_e&&sa[i-1]>=s_b&&sa[i-1]<=s_e) | | (sa[i]>=s_b&&sa[i]<=s_e&&sa[i-1]>=f_b&&sa[i-1]<=f_e)) max=H[i]; - } Aboutprintf"%d", max); $ return 0; -}
POJ2774 (suffix array)