Cod sursa(job #2117060)

Utilizator 24601Dan Ban 24601 Data 28 ianuarie 2018 14:34:14
Problema Prefix Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
#include <string.h>

static char s[1000001];
static size_t pi[1000001];

int main(void)
{
    size_t t, i, q, diff, plen;
    char *p, found;

    freopen("prefix.in", "r", stdin);
    freopen("prefix.out", "w", stdout);

    scanf("%lu", &t);

    while (t--) {
        p = s + 1;
        fgets(p, sizeof s, stdin);
        plen = strlen(p) - 1;
        p[plen] = '\0';

        if (plen == 0) {
            t++;
            continue;
        }

        pi[1] = 0;
        q = 0;

        for (i = 2; i <= plen; i++) {
            while (q > 0 && s[q + 1] != s[i]) {
                q = pi[q];
            }

            if (s[q + 1] == s[i]) {
                q++;
            }

            pi[i] = q;
        }

        /*
        for (i = 1; i <= plen; i++) {
            fprintf(stderr, "  %c", s[i]);
        }
        fprintf(stderr, " %lu\n", strlen(p));
        for (i = 1; i <= strlen(p); i++) {
            fprintf(stderr, "%3ld", pi[i]);
        }
        fprintf(stderr, "\n");
        */

        for (i = plen; i > 0; i--) {
            if (i % (i - pi[i]) == 0 && i - pi[i] < i) {
                break;
            }
        }

        printf("%lu\n", i);
    }

    return 0;
}