Cod sursa(job #2117054)

Utilizator 24601Dan Ban 24601 Data 28 ianuarie 2018 14:24:39
Problema Prefix Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 1.18 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;
    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);
        p[strlen(p) - 1] = '\0';

        if (strlen(p) == 0) {
            t++;
            continue;
        }

        pi[1] = 0;
        q = 0;

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

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

            pi[i] = q;
        }

        for (i = strlen(p); i > 0; i--) {
            diff = i - pi[i];
            q = i;
            found = 1;

            do {
                if (q == 2 * diff) {
                    break;
                } else if (pi[q] == 0 || pi[q] % diff != 0) {
                    found = 0;
                }

                q -= diff;
            } while (found);

            if (found) {
                break;
            }
        }

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

    return 0;
}