题目大意:
求出这些DNA序列中的最长且字典序最小的公共子串。
思路分析:
二分长度的答案,去height中扫描这个长度是否满足,一旦满足就立即输出。这样就能够保证字典序最小了。
#include#include #include #include #define maxn 1005using namespace std;char str[maxn];int sa[maxn],t1[maxn],t2[maxn],c[maxn],n;void suffix(int m){ int *x=t1,*y=t2; for(int i=0;i =0;i--)sa[--c[x[i]]]=i; for(int k=1;k<=n;k<<=1) { int p=0; for(int i=n-k;i =k)y[p++]=sa[i]-k; for(int i=0;i =0;i--)sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1;x[sa[0]]=0; for(int i=1;i =n)break; m=p; }}int rank[maxn],height[maxn];void getheight(){ int k=0; for(int i=0;i >1; if(check(mid))ans=mid,fans=pos,l=mid+1; else r=mid-1; } if(ans<3)printf("no significant commonalities"); else { for(int i=fans;i