Cod sursa(job #1876611)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 12 februarie 2017 14:56:22
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;
ifstream in("prefix.in");
ofstream out("prefix.out");

const int NMax = 1000000 + 5;

int T,N;
char str[NMax];
int pf[NMax];
// str - sirul citit
// pf - functia prefix care se genereaza pentru algoritmul KMP

int main() {
    in>>T;
    while (T--) {
        in>>(str+1);
        N = strlen(str+1);

        // se construieste pf
        int k = 0;
        pf[1]=0;
        for (int i=2;i<=N;++i) {
            while (str[i]!=str[k+1] && k>0) {
                k = pf[k];
            }
            if (str[i]==str[k+1]) {
                ++k;
            }
            pf[i] = k;
        }

        bool found = false;
        for (int i=N;i>0;--i) {
            if (pf[i]==0) {
                continue;
            }

            // daca am un sufix maximal in i care e prefix al sirului,
            // atunci, datorita modului in care se construieste functia pf si ce inseamna aceasta,
            // prefixul de lungime p incepe sa se repete periodic de la pozitia i-pf[i]+1.
            // daca este si divizor al sufixului maximal, inseamna ca prefixul p se repeta complet,
            // fara sa se termine prematur, adica i = p + p + ... + p
            int p = i - pf[i];
            if (pf[i]%p==0) {
                found = true;
                out<<i<<'\n';
                break;
            }
        }
        if (!found) {
            out<<0<<'\n';
        }
    }
    in.close();out.close();
    return 0;
}