Cod sursa(job #893876)

Utilizator andreea29Iorga Andreea andreea29 Data 26 februarie 2013 18:33:08
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include<fstream>
#include<cstring>

#define Nmax 1000010

using namespace std;

int n, i, p, pi[Nmax], t;
char a[Nmax], s[Nmax], d[5];

int main()
{
    ifstream f("prefix.in");
    ofstream h("prefix.out");
    f >> t;
    f.getline (d, 5);
    for (int q = 1; q <= t; ++q)
    {
        f.getline (s, Nmax);
        n = strlen(s);
        for (i = 1; i <= n; ++i)
            a[i] = s[i - 1];
        p = 0;
        memset (pi, 0, sizeof(pi));

        for (i = 2; i <= n; ++i)
        {
            while (p > 0 && a[p + 1] != a[i])
                p = pi[p];
            if (a[p + 1] == a[i])
                ++p;
            pi[i] = p;
        }
        while (n)
        {
            if (pi[n] && n % (n - pi[n]) == 0)
            {
                h << n << '\n';
                break;
            }
            --n;
        }
        if (n == 0)
            h << "0\n";
    }
}