Cod sursa(job #1844740)

Utilizator DevilOnFieldTudor Horia Niculescu DevilOnField Data 10 ianuarie 2017 13:26:23
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<stdio.h>


const int MAXN = 1000005;
char v[MAXN];
int kmp[MAXN];

int t;

FILE *in, *out;

int main ()
{

    in = fopen("prefix.in", "r");
    out = fopen("prefix.out", "w");

    fscanf(in, "%d", &t);

    for(int i = 0; i < t; i++) {
        fscanf(in, "%s", v + 1);

        v[0] = '#';
        kmp[0] = 0;
        kmp[1] = 0;
        int j = 2;
        while(v[j] != 0) {
            int poz = kmp[j - 1];
            while(poz != 0 && v[j] != v[poz + 1]) {
                poz = kmp[poz];
            }
            if(v[poz + 1] == v[j]) {
                kmp[j] = poz + 1;
            } else {
                kmp[j] = 0;
            }
            //printf("%d ", kmp[j]);
            j++;
        }


        int deafis = 0;
        j = 2;
        while(v[j] != 0) {
            if((j % (j - kmp[j])) == 0 && kmp[j] != 0) {
                //printf("j%d::kmp[j]%d  || ", j, kmp[j]);
                deafis = j;
            }
            j++;
        }
/*
        printf("\n");
        printf("\n--\n");
*/
        fprintf(out, "%d\n", deafis);
    }

    fclose(in);
    fclose(out);

    return 0;
}