Pagini recente » Cod sursa (job #2891154) | Cod sursa (job #36272) | Cod sursa (job #224604) | Cod sursa (job #860822) | Cod sursa (job #843837)
Cod sursa(job #843837)
#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, (iStringLength + 1) *sizeof(int));
while (iIndex < iStringLength)
{
/*while (str[iCandidateIndex] != str[iIndex-1] && iCandidateIndex > 0)
{
iCandidateIndex = PrefixTable[iCandidateIndex];
}*/
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 iNextPossibleLength = 0;
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)
{
iNumPeriods = iNumPeriods > 0 ? ++iNumPeriods : 0;
iPeriodicPrefixLength = std::max(iPeriodicPrefixLength, iNumPeriods * iPeriodLength);
iPeriodLength = i + 1;
iNumPeriods = 0;
iCurrentLength = 0;
}
}
iNumPeriods = iNumPeriods > 0 ? ++iNumPeriods : 0;
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";
}
fin.close();
fout.close();
return 0;
}