#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define MIN(a, b) ((a) > (b)? (b) : (a))
typedef struct stack {
size_t size;
size_t sp;
char s[];
} st;
st *init(size_t size)
{
st *ns;
ns = malloc(sizeof(*ns) + size);
assert(ns != NULL);
ns->size = size;
ns->sp = 0;
return ns;
}
void push(st **t, char c)
{
assert(t != NULL);
st *s = *t;
if (s->sp == s->size) {
assert(s->size < -1U / 2);
*t = realloc(s, sizeof(*s) + s->size * 2);
assert(*t != NULL);
(*t)->size = s->size * 2;
}
(*t)->s[s->sp++] = c;
}
int main()
{
int t;
scanf("%d\n", &t);
st *dump[t];
for (int i = 0; i < t; i++) {
int c;
const int first = getchar();
size_t lp = 0;
st *tmp;
if (first == '\n') {
printf("true\n");
return 0;
}
tmp = init(16);
dump[i] = init(16);
push(&dump[i], first);
lp = dump[i]->sp;
push(&tmp, first);
while ((c = getchar()) != EOF) {
if (c == '\n') {
if (tmp->sp == lp) {
free(dump[i]);
dump[i] = tmp;
} else {
free(tmp);
}
for (int j = 0; j < i; j++) {
if (dump[j]->sp == dump[i]->sp &&
!strncmp(dump[j]->s,
dump[i]->s,
dump[i]->sp)) {
printf("true\n");
return 0;
}
}
break;
}
push(&dump[i], c);
if (c == first) {
tmp->sp = 0;
}
if (tmp->sp == lp || dump[i]->s[tmp->sp] != c) {
lp = dump[i]->sp;
tmp->sp = 0;
} else {
push(&tmp, c);
}
}
if (c == EOF) {
return 1;
}
}
printf("false\n");
}
https://pastebin.com/rRheDZU9
dump[t] 말고 바이너리트리에 넣으면 더 빠를텐데 거기까지하기는 너무 코드가길어져서 안함
댓글 0