Cod sursa(job #843887)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 28 decembrie 2012 16:10:16
Problema Prefix Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>
#include <cstring>

#define MAXN 1000001

using namespace std;

int PrefixTable[MAXN];

void BuildPrefixTable(const string& str, int PrefixTable[])
{
    int iCandidateIndex = 0;
    int iIndex = 1;
    const int iStringLength = str.length();
    
    memset(PrefixTable, 0, (MAXN) * sizeof(int));
    
    while (iIndex < iStringLength)
    {
        if (str[iCandidateIndex] != str[iIndex])
        {
            iCandidateIndex = 0;
        }

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

int ComputePeriodicPrefixLength(const int PrefixTable[], int n)
{
    int iCurrentLength = 0;
    int iPeriodLength = 0;
    int iNumPeriods = 0;
    
    int iPeriodicPrefixLength = 0;

    for (int i=0; i<n; ++i)
    {
        if (PrefixTable[i] > 0)
        {
            ++iCurrentLength;

            if (iCurrentLength == iPeriodLength)
            {
                ++iNumPeriods;
                iCurrentLength = 0;
            }
        }
        else if (PrefixTable[i] == 0)
        {
            if (iNumPeriods > 0)
            {
                ++iNumPeriods;
                iPeriodicPrefixLength = std::max(iPeriodicPrefixLength, iNumPeriods * iPeriodLength);
            }

            iPeriodLength = i + 1;
            iNumPeriods = 0;
            iCurrentLength = 0;
        }
    }

    if (iNumPeriods > 0)
    {
        ++iNumPeriods;
        iPeriodicPrefixLength = std::max(iPeriodicPrefixLength, iNumPeriods * iPeriodLength);
    }
    
    return iPeriodicPrefixLength;
}

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;
}