Cod sursa(job #1596706)

Utilizator algebristulFilip Berila algebristul Data 11 februarie 2016 12:15:46
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.71 kb
#include <cstdio>
#include <cstring>

using namespace std;

const int NMAX = 1000006;
int T;
int N;
int P[NMAX];
char S[NMAX];

int solve() {
    N = strlen(S + 1);

    P[1] = 0;
    for (int i = 2, k = 0; i <= N; i++) {
        while (k && S[k + 1] != S[i]) {
            k = P[k];
        }

        if (S[k + 1] == S[i])
            k++;

        P[i] = k;
    }

    for (int i = N; i >= 2; i--) {
        if (!P[i]) continue;
        if (P[i] % (i - P[i]) == 0)
            return i;
    }

    return 0;
}

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

    scanf("%d", &T);
    while (T--) {
        scanf("%s", S + 1);
        printf("%d\n", solve());
    }

    return 0;
}