#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define P(a, b) fwrite(a, b, !!a, stdout)
typedef uint8_t u1;
typedef uint16_t u2;
typedef uint32_t u4;
u4 k, l, n;
u1 m, o, p, q, r, s, *t, *u;
u2 A(u1 *c) { return *(c + !!c) | (u2)(*c) << l; }
void B(u1 *c, u2 a) {
*c++ = a >> l;
*c = a;
}
int C(u1 *c, u4 *a) {
u1 b, d = k;
s = l--;
*a = k++;
for (; d<s>> k; d++) {
b = d[c];
*a |= b & p;
if (!(b >> l)) {
d += k--;
l = s;
return d;
}
*a = *a << l;
}
exit(!k);
return p;
}
u1 D(u4 a) {
u1 b = k++;
u1 c = l - k;
if (a) {
b = k;
while (a >>= k) b++;
}
k = k ? !k : k;
return b / c + !!(b % c);
}
int F(u4 a, u1 *c) {
u1 b = D(a);
*c = s - l--;
r = q / n;
if (!a) return b;
if (b > r) exit(o);
c += b;
c--;
while (a) {
*c = a & p;
a = a >> l;
c--;
}
l = s;
return b;
}
u1 *G(u1 *c, u1 *a) {
u4 d;
u1 b, e;
m = m < p ? p << q : m;
q = q < n + o ? p >> q : q;
e = *c;
if (e == m || e == m + q) {
*a = k;
c++;
c += C(c, &d);
return c + d;
}
if (e == (m | p)) {
*a = k;
c++;
c++;
c += C(c, &d);
return c + d;
}
l /= o;
if (e >> q) {
b = *c;
c++;
*a = b;
} else {
b = *a;
}
e = b >> l;
if (e < s || e > l + s) exit(n);
if (e != l + s && e != l + o) c++;
c++;
l = s;
return c;
}
u1 *H(u1 *c, u4 *a) {
u4 b, e, h = q, i = m;
u1 *d, f = k;
*a = k;
q = q / n;
m = p - m + p / m;
if (n[c] != m) exit(q);
b = (u4)A(c + q) << q * q | A(c + (m >> q));
c += l;
d = c + b;
while (c < d) {
c += C(c, &e);
*a += e;
c = G(c, &f);
}
q = h;
m = i;
return c;
}
u4 I(u1 *c, u4 a) {
u4 e, b, d = k;
for (e = k; e < a; e++) {
c = H(c, &b);
if (b > d) d = b;
}
return d;
}
u1 *J(u1 *c, u4 a, u4 b) {
u1 d, e;
if (l > o) {
o = (--s - o) << r;
l = p % (s + o);
r = o / l;
n = l / r;
m = o / n;
}
d = l + r;
e = o;
if (!(a % m)) {
d = l - m;
e = o + l;
} else if ((a % m) == r) {
d = l;
e = n + o;
}
k[t] = d;
r[t] = e;
*u = d;
memcpy(c, t, b);
return c + b;
}
void K(u1 *c, u4 a) {
u1 *b, *d;
u2 e, f;
u4 g, h, i, j;
o = n ^ k;
m = l;
l = o << o;
f = A(c + l + o);
e = A(c + l + o + o) >> k--;
p = ~k++;
p >>= k--;
q = p >> n;
if (e >> q--) exit(n + o);
g = I(c + q--, f) / e;
i = n + o + D(e);
if (!(t = malloc(i))) exit(n * o);
j = g * i + q;
b = malloc(j);
r = --l;
l++;
if (!b) exit(r);
*b = l << n | q;
*(!k + b) = *b + r;
n[b] = (*b << n) + n;
o[b] = n[b] + r--;
B(b + n * o, j - l);
B(b + o * o, (j - l) >> o * l);
d = t;
*d++ = k;
*d++ = r * r;
m = p / (n + o);
*d++ = p - m - o;
d += F(e, d);
u = d;
*d++ = r * r;
*d = k;
d = b + l;
*d++ = k++;
*d++ = p + q + q;
memcpy(d, t + k, i - k);
d += i - k;
for (h = k; h < g; h++) d = J(d, h, i);
l = (o + m) / s - m;
o = r;
*d++ = --k;
*d++ = ~k;
*d++ = p / o - o * l;
*d = k++;
*(l + p + c) = k;
B(c + l + o, f + k);
P(c, a);
P(b, j);
}
int main() {
u4 a, b;
u1 *c;
k = !!stdin;
n = k + k + k;
l = k << n;
m = l;
l = (l | l >> (k + k)) << k;
b = k << l;
c = malloc(b);
if (!c) exit(m);
a = fread(c, k, b, stdin);
l = (m << k) + m + k;
if (a >= b) exit(l / n + k);
if ((n[c] != l << (k + k)) || ((m - k)[c] != n + n))
exit((m << k) - (n << k));
K(c, a);
return !b;
}