Cod sursa(job #2305695)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 20 decembrie 2018 21:07:44
Problema Prefix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin("prefix.in");
ofstream fout("prefix.out");

int N, pi[1000005];
char s[1000005];

bool isPeriodic[1000005];

inline int CMMDC(int a, int b)
{
    int r = a % b;

    while(r)
    {
        a = b;
        b = r;
        r = a % b;
    }

    return b;
}

void Solve()
{
    pi[1] = 0;

    int j = 0;
    for(int i = 2; i <= N; i++)
    {
        while(j && s[j + 1] != s[i])
            j = pi[j];

        if(s[j + 1] == s[i])
            j++;

        pi[i] = j;
    }

    int sol = 0, currentMaxPeriod = 1;

    for(int i = 2; i <= N; i++)
        {
            if(i % 2 == 0)
                if(pi[i] == i / 2)
                    currentMaxPeriod = i / 2;

            if(i % currentMaxPeriod == 0)
                if(i == pi[i] + currentMaxPeriod)
                    sol = i;
        }

    fout << sol << '\n';

    /*
    for(int i = 1; i <= N; i++)
        fout << s[i] << "   ";
    fout << '\n';
    for(int i = 1; i <= N; i++)
        fout << pi[i] << "   ";
    fout << '\n';
    */
}

int main()
{
    int T;
    fin >> T;
    fin.get();

    while(T--)
    {
        fin >> s;

        N = strlen(s);
        for(int i = N; i >= 1; i--)
            s[i] = s[i - 1];

        Solve();
    }

    return 0;
}