Cod sursa(job #856907)

Utilizator SteveStefan Eniceicu Steve Data 17 ianuarie 2013 07:59:36
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <iomanip>
#include <string>
#include <cstring>
#include <deque>
#include <stack>
#include <bitset>
#include <list>
#define pb push_back
#define pf push_front
#define pob pop_back
#define pof pop_front
#define mp(a,b) make_pair (a, b)
#define ll long long
#define max(a, b) (a > b ? a : b)
#define min(a, b) (a < b ? a : b)

using namespace std;

char s[1000011];
int N;
int Pi[1000011];

void Precompute ()
{
    for (int i = 2, p = 0; i <= N; i++)
    {
        for (; p > 0 && s[p + 1] != s[i];) p = Pi[p];
        if (s[i] == s[p + 1]) p++;
        Pi[i] = p;
    }
}

int Business ()
{
    for (int i = N; i >= 2; i--)
        if (Pi[i] && !(i % (i - Pi[i]))) return i;
    return 0;
}

int main ()
{
    int T;
    ifstream fin ("prefix.in");
    ofstream fout ("prefix.out");
    fin >> T;
    while (T--)
    {
        fin >> (s + 1);
        N = strlen (s + 1);
        Precompute ();
        fout << Business () << "\n";
    }
    fin.close ();
    fout.close ();
    return 0;
}