Cod sursa(job #2679376)

Utilizator Mihai_BarbuMihai Barbu Mihai_Barbu Data 30 noiembrie 2020 14:40:58
Problema Prefix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <bits/stdc++.h>

using namespace std;

#define NMAX 1000002

#define in "prefix.in"
#define out "prefix.out"

FILE *fin = fopen(in, "r");
FILE *fout = fopen(out, "w");

int ps[NMAX];

void genFail(char *str, int l) {
    int i, j;

    ps[0] = ps[1] = 0;

    for (i = 1; i < l; ++i) {
        j = ps[i];

        while (j && str[i] != str[j]) {
            j = ps[j];
        }

        if (str[i] == str[j]) {
            j++;
        }

        ps[i + 1] = j;
    }
}

void parseStr(char *str, int l) {
    int i;
    
    /* Calculate the "failure" function */
    genFail(str, l);

    for (i = l; i >= 1; --i) {
        /** 
         * check if at the current index i
         * the string has a suffix which is also a prefix
         *           --> has a period 
         */
    	if (ps[i] && i % (i - ps[i]) == 0) {
    	    break;
    	}
    }

    fprintf(fout, "%d\n", i);
}

int main() {
	char str[NMAX], s[2];
    int N, i, l;

    fscanf(fin, "%d", &N);
    /* Read '\n' */
    fgets(s, 2, fin);

    for (i = 0; i < N; ++i) {
        fgets(str, NMAX, fin);
        l = strlen(str);
        str[l - 1] = '\0';
        l--;

        parseStr(str, l);
    }

    return 0;
}