int main() { SuffixArray in; while(gets(in.str) && in.str[0] != '\0') { int n = 0; for(int i = 0; in.str[i]; i++) if(in.str[i] != ' ') in.str[n++] = in.str[i]; in.str[n] = '\0'; in.build(); in.build_h(); if(n == 0) puts("0"); for(int i = 1; i <= in.n; i++) { int cnt = 0, ret = 0; for(int j = 0; j < in.n; j++) { if(in.h[j] >= i) cnt++; else ret = max(ret, cnt), cnt = 0; } ret = max(ret, cnt); if(ret <= 0) break; printf("%d\n", ret + 1); } puts(""); } return 0; }
int main() { int i, first = 0; while(scanf("%d", &n) == 1 && n) { if(first) puts(""); first = 1; int m = 0; half = n/2; // > half int mxlen = 0; for(i = 0; i < n; i++) { scanf("%s", SA.str+m); int cnt = 0; while(SA.str[m]) Sfrom[m] = i, m++, cnt++; if(cnt > mxlen) mxlen = cnt; Wlen[i] = cnt; SA.str[m++] = '$'; SA.str[m] = 0; } SA.str[m-1] = '\0'; if(n == 1) { puts(SA.str); continue; } //puts(SA.str); SA.build(); SA.build_h(); int l = 1, r = mxlen; int res = 0; while(l <= r) { m = (l+r)/2; if(check(m, 0)) { l = m+1; if(m > res) res = m; } else { r = m-1; } } if(res == 0) puts("?"); else check(res, 1); } return 0; }
static void init_suffix_array( const String& s, SuffixArray& sa ) { sa.init(s); sa.build(); sa.buildHeight(); }