Cod sursa(job #843968)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 28 decembrie 2012 17:34:35
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>
#include <cstring>

#define MAXN 1000005

using namespace std;

int PrefixTable[MAXN];

void BuildPrefixTable(const string& str, int PrefixTable[])
{
    int iCandidateIndex = 0;
    int iIndex = 2;
    const int iStringLength = str.length();
    
    PrefixTable[0] = PrefixTable[1] = 0;
    
    while (iIndex <= iStringLength)
    {
        while (str[iCandidateIndex] != str[iIndex - 1] && iCandidateIndex > 0)
        {
            iCandidateIndex = PrefixTable[iCandidateIndex];
        }

        if (str[iCandidateIndex] == str[iIndex - 1])
        {
            ++iCandidateIndex;
        }
        
        PrefixTable[iIndex] = iCandidateIndex;
        
        ++iIndex;
    }
}

int ComputePeriodicPrefixLength(const int PrefixTable[], int n)
{
    for (int i=n; i>0; --i)
    {
        if (PrefixTable[i] > 0 && i % (i - PrefixTable[i]) == 0)
        {
            return i;
        }
    }
    
    return 0;
}

int main()
{
    int T=0;
    fstream fin("prefix.in", fstream::in);
    fstream fout("prefix.out", fstream::out);
    
    ostream_iterator<int> itOut(cout, " ");
    
    fin >> T;
    //cout << T << endl;
    
    for (int i=0; i<T; ++i)
    {
        string str;
        fin >> str;
        //cout << str << endl;
        
        BuildPrefixTable(str, PrefixTable);
        
        //copy(PrefixTable, PrefixTable + str.length(), itOut);
        //cout << endl;
        fout << ComputePeriodicPrefixLength(PrefixTable, str.length()) << "\n";
        
        //cout << endl;
    }
    
    fin.close();
    fout.close();
    return 0;
}