zoj3395字尾樹組-2
阿新 • • 發佈:2018-11-01
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3971
題意:求一個數組中重複出現至少m次的最長字串。。。
分析:二分答案進行判斷即可。。對每個判斷的長度,只需要看連續在這段裡面的height>=mid的個數是不是>=m-1即可。。
ps:本題刷到rank1了,呵呵。。
關鍵程式碼:240ms
void print(int mid) { int i, j, mx, right=-1; for(i=1; i<=len; ) { while(i<=len && height[i]<mid) i++; j=i; mx = 0; if(sa[i-1]>mx) mx = sa[i-1]; while(j<=len && height[j]>=mid) { if(sa[j]>mx) mx = sa[j]; j++; } if(j-i>=m-1) { if(mx>right) right = mx; } i = j; } printf("%d %d\n", mid, right); } int main() { int i, l, r, mid, ans; while(scanf("%d", &m)!=EOF) { if(m==0) break; //scanf("%s", s); gets(s); gets(s); len = strlen(s); if(m==1) { printf("%d 0\n", len); continue; } for(i=0; i<len; i++) a[i] = s[i]-'a'+1; a[len] = 0; dc3(a, sa, len+1, 28); calheight(a, sa, len); l=0, r=len-1; while(l<=r) { mid = (l+r)>>1; if(check(mid)) l = mid+1; else r = mid-1; } ans = r; if(ans==0) printf("none\n"); else print(ans); } return 0; }