int main() { int i,j,n,ans=0,w; scanf("%d",&j); scanf("%s",s); s[j]=1; scanf("%s",s+j+1); n=j+j+1; for(i=0;i<n;i++) r[i]=s[i]; r[n]=0; dc3(r,sa,n+1,128); calheight(r,sa,n); for(i=2;i<=n;i++) if(height[i]>ans) if((j<sa[i-1] && j>sa[i]) || (j>sa[i-1] && j<sa[i])) ans=height[i],w=sa[i]; s[w+ans]=0; printf("%s\n",s+w); return 0; }
int main() { int n; int count = 0; while (scanf("%d", &n) == 1) { for (int i = 0; i < n; i++) { char c; scanf(" %c", &c); r[i] = c - 'A' + 1; } r[n] = 'Z' -'A' + 2; for (int i = n + 1; i <= 2 * n; i++) r[i] = r[2 * n - i]; r[2 * n + 1] = 0; //for (int i = 0; i <= 2 * n + 1; i++) printf("%d ", r[i]); //puts(""); da(r, sa, 2 * n + 2, 'Z' - 'A' + 3); calheight(r, sa, 2 * n + 1); //for (int i = 0; i <= 2 * n; i++) // printf("%d ", rank[i]); int pre = 0, post = n+1; for (int i = 0; i < n; i++) { if (rank[pre] < rank[post]) printf("%c", 'A' + r[pre++] - 1); else printf("%c", 'A' + r[post++] - 1); if (++count == 80) { puts(""); count-=80; } } //puts(""); } puts(""); return 0; }
int main() { while (scanf("%s", str), strcmp(str, ".") != 0) { int len = strlen(str); for (int i = 0; i < len; i++) { r[i] = str[i]; } r[len] = 0; dc3(r, sa, len + 1, 300); calheight(r, sa, len); /* for(int i=0;i<=len;i++){ printf("%d ", sa[i]); } puts(""); for(int i=0;i<len;i++){ printf("%d ", rank[i]); } puts(""); for(int i=1;i<=len;i++){ printf("%d ", height[i]); } puts(""); //*/ int ans; memset(map, 0, sizeof(map)); make_rmq(len); for (int i = 1; i <= len; i++) { if (len % i)continue; if (check(i, len)) { ans = len / i; break; } } printf("%d\n", ans); } return 0; }
int main() { int cas = 0; while (scanf("%s", s) && s[0] != '#') { int l = strlen(s); for (int i = 0; i < l; i++) r[i] = s[i] - 'a' + 1; r[l] = 0; da(r, sa, l+1, 27); calheight(r, sa, l); init_rmq(l); int ans = 0; for (int i = 1; i <= l / 2; i++) for (int j = 0; j + i < l; j+=i) { int k = lcp(j, j+i); int x = k / i + 1; if (x + 1 < ans) continue; int aa = i - k % i; bool flag = 0; if (j >= aa) { int kk = lcp(j-aa, j+i-aa); int xx = kk / i + 1; if (xx > x) x = xx, flag = 1; } // if (j-aa >= 0 && lcp(j-aa, j+i-aa) >= (x+1) * (i-1)) x++, flag = 1; if (ans < x) { ans = x; cnt = 0; zz[cnt] = flag ? j-aa : j; zz1[cnt++] = i; } else if (ans == x) { zz[cnt] = flag ? j-aa : j; zz1[cnt++] = i; } } printf("Case %d: ", ++cas); char cc = 'z'; if (ans == 1) { for (int i = 0; i < l; i++) if (s[i] < cc) cc = s[i]; printf("%c\n", cc); continue; } int start = zz[0]; int l0 = zz1[0]; for (int i = 0; i < cnt; i++) { int k = lcp(zz[i], zz[i]+zz1[i]); int aa = k - k % zz1[i]; for (int j = zz[i]; j >= 0 && j >= zz[i]-aa; j--) if (lcp(j, j+zz1[i]) < (ans-1) * zz1[i]) break; else if (rank[j] < rank[start]) { start = j; l0 = zz1[i]; } } s[start+l0*ans] = '\0'; puts(s+start); } return 0; }