Pagini recente » Cod sursa (job #1944740) | Cod sursa (job #2226031) | Cod sursa (job #1550714) | Cod sursa (job #2424897) | Cod sursa (job #843965)
Cod sursa(job #843965)
#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[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;
}