Pagini recente » Cod sursa (job #1145237) | Cod sursa (job #1757128) | Cod sursa (job #20414) | Cod sursa (job #2142023) | Cod sursa (job #843887)
Cod sursa(job #843887)
#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;
}