#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum {
SIZE = 8192
};
size_t count(const char *s, int c)
{
size_t r;
for (r = 0; *s; r += *s++ == (char) c)
;
return r;
}
size_t max_strcspn(const char *s, int c)
{
size_t max, tmp;
for (max = tmp = 0; *s; s++) {
if (*s != (char) c) {
tmp++;
continue;
}
if (tmp > max)
max = tmp;
tmp = 0;
}
return max;
}
char *fill(char *to, size_t longest, size_t lines, const char *from)
{
char *save = to;
size_t n;
for (n = longest; lines; from++)
if (*from == '\n') {
to += n;
n = longest;
lines--;
} else {
*to++ = *from;
n--;
}
return save;
}
char *readall(FILE *iop)
{
char buf[SIZE];
size_t a = 0, n;
char *r, *tmp;
for (r
= 0; (n
= fread(buf
, 1, SIZE
, iop
)) == SIZE
; r
= tmp
) { if (!(tmp
= realloc(r
, a
+ SIZE
))) { return 0;
}
memcpy(tmp
+ SIZE
, buf
, SIZE
); a += SIZE;
}
if (!(tmp
= realloc(r
, a
+ n
+ 1))) { return 0;
}
tmp[a + n] = '\0';
return tmp;
}
int main(void)
{
size_t lines, longest;
char *ptr, *s;
if (!(s = readall(stdin))
|| !(ptr
= malloc((lines
= count
(s
, '\n')) * (longest = max_strcspn(s, '\n'))))) {
return EXIT_FAILURE;
}
fill(ptr, longest, lines, s);
for (size_t i = 0; i < longest; i++) {
for (size_t n = 0; n < lines; n++)
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKZW51bSB7CglTSVpFID0gODE5Mgp9OwoKc2l6ZV90IGNvdW50KGNvbnN0IGNoYXIgKnMsIGludCBjKQp7CglzaXplX3QgcjsKCglmb3IgKHIgPSAwOyAqczsgciArPSAqcysrID09IChjaGFyKSBjKQoJCTsKCXJldHVybiByOwp9CgpzaXplX3QgbWF4X3N0cmNzcG4oY29uc3QgY2hhciAqcywgaW50IGMpCnsKCXNpemVfdCBtYXgsIHRtcDsKCglmb3IgKG1heCA9IHRtcCA9IDA7ICpzOyBzKyspIHsKCQlpZiAoKnMgIT0gKGNoYXIpIGMpIHsKCQkJdG1wKys7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAodG1wID4gbWF4KQoJCQltYXggPSB0bXA7CgkJdG1wID0gMDsKCX0KCXJldHVybiBtYXg7Cn0KCmNoYXIgKmZpbGwoY2hhciAqdG8sIHNpemVfdCBsb25nZXN0LCBzaXplX3QgbGluZXMsIGNvbnN0IGNoYXIgKmZyb20pCnsKCWNoYXIgKnNhdmUgPSB0bzsKCXNpemVfdCBuOwoKCWZvciAobiA9IGxvbmdlc3Q7IGxpbmVzOyBmcm9tKyspCgkJaWYgKCpmcm9tID09ICdcbicpIHsKCQkJbWVtc2V0KHRvLCAnICcsIG4pOwoJCQl0byArPSBuOwoJCQluID0gbG9uZ2VzdDsKCQkJbGluZXMtLTsKCQl9IGVsc2UgewoJCQkqdG8rKyA9ICpmcm9tOwoJCQluLS07CgkJfQoJcmV0dXJuIHNhdmU7Cn0KCmNoYXIgKnJlYWRhbGwoRklMRSAqaW9wKQp7CgljaGFyIGJ1ZltTSVpFXTsKCXNpemVfdCBhID0gMCwgbjsKCWNoYXIgKnIsICp0bXA7CgoJZm9yIChyID0gMDsgKG4gPSBmcmVhZChidWYsIDEsIFNJWkUsIGlvcCkpID09IFNJWkU7IHIgPSB0bXApIHsKCQlpZiAoISh0bXAgPSByZWFsbG9jKHIsIGEgKyBTSVpFKSkpIHsKCQkJZnJlZShyKTsKCQkJcmV0dXJuIDA7CgkJfQoJCW1lbWNweSh0bXAgKyBTSVpFLCBidWYsIFNJWkUpOwoJCWEgKz0gU0laRTsKCX0KCWlmICghKHRtcCA9IHJlYWxsb2MociwgYSArIG4gKyAxKSkpIHsKCQlmcmVlKHIpOwoJCXJldHVybiAwOwoJfQoJbWVtY3B5KHRtcCArIGEsIGJ1Ziwgbik7Cgl0bXBbYSArIG5dID0gJ1wwJzsKCXJldHVybiB0bXA7Cn0KCmludCBtYWluKHZvaWQpCnsKCXNpemVfdCBsaW5lcywgbG9uZ2VzdDsKCWNoYXIgKnB0ciwgKnM7CgoJaWYgKCEocyA9IHJlYWRhbGwoc3RkaW4pKQoJIHx8ICEocHRyID0gbWFsbG9jKChsaW5lcyA9IGNvdW50KHMsICdcbicpKSAqCgkJCSAgIChsb25nZXN0ID0gbWF4X3N0cmNzcG4ocywgJ1xuJykpKSkpIHsKCQlmcmVlKHMpOwoJCXJldHVybiBFWElUX0ZBSUxVUkU7Cgl9CglmaWxsKHB0ciwgbG9uZ2VzdCwgbGluZXMsIHMpOwoJZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsb25nZXN0OyBpKyspIHsKCQlmb3IgKHNpemVfdCBuID0gMDsgbiA8IGxpbmVzOyBuKyspCgkJCXB1dGNoYXIocHRyW2xvbmdlc3QgKiBuICsgaV0pOwoJCXB1dHMoIiIpOwoJfQoJZnJlZShzKTsKCWZyZWUocHRyKTsKfQ==