题目链接:
题意:
让你找一个重复最多的子串,并且输出。
题解:
这个是论文题,看的,不是很理解为什么这样就能完全找完,当作结论使吧。
1 #include2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 namespace suffixarray{ 5 #define FN(n) for(int i=0;i =0;i--)sa[--c[x[i]]]=i;11 for(int k=1,p;p=0,k<=n;k=p>=n?N:k<<1,m=p){12 for(int i=n-k;i =k)y[p++]=sa[i]-k;14 FN(m)c[i]=0;FN(n)c[x[y[i]]]++;FN(m)c[i+1]+=c[i];15 for(int i=n-1;i>=0;i--)sa[--c[x[y[i]]]]=y[i];16 swap(x,y),p=1,x[sa[0]]=0;17 for(int i=1;i r)swap(l,r);39 l++;40 int k=31-__builtin_clz(r-l+1);41 return min(f[l][k],f[r-(1< =0&&r%l)step+=(find(k,k+l)>=r);57 if(step>mx)58 {59 mx=step,cnt=0;60 ans[cnt++]=l;61 }else if(step==mx)ans[cnt++]=l;62 }63 int tmp=-1,st;64 for(int i=1;i<=len&&tmp==-1;i++)F(j,0,cnt-1)65 {66 int l=ans[j];67 if(find(sa[i],sa[i]+l)>=(mx-1)*l)68 {69 tmp=l,st=sa[i];70 break;71 }72 }73 printf("Case %d: ",++cas); 74 for(int i=st,j=0;j