Pagini recente » Diferente pentru propuneri/3-infoarena3 intre reviziile 30 si 63 | Cod sursa (job #2893403) | Diferente pentru planificare/sedinta-20090316 intre reviziile 34 si 35 | Istoria paginii utilizator/rusurares | Cod sursa (job #1936705)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("prefix.in");
ofstream fout ("prefix.out");
const int N = 1000005;
string text;
int lengthText, questions, maximumLength;
int maximum, positionMaximum, mainPeriodLength, solution;;
int prefix[N];
void calculatingPrefixes(){
int matches = 0;
for ( int index = 2; index <= lengthText; index++ ){
for ( ; text[index] != text[matches+1] and matches; )
matches = prefix[matches];
if ( text[index] == text[matches+1] )
matches++;
prefix[index] = matches;
}
}
int main(){
fin >> questions;
for ( ; questions; questions-- ){
fin >> text;
lengthText = text.size();
maximumLength = max(maximumLength, lengthText);
text = " " + text;
for ( int index = 1; index <= maximumLength; index++ )
prefix[index] = 0;
maximum = positionMaximum = solution = 0;
calculatingPrefixes();
for ( int index = 1; index <= lengthText; index++ ){
if ( prefix[index] > maximum ){
maximum = prefix[index];
positionMaximum = index;
}
}
mainPeriodLength = positionMaximum - maximum;
for ( int index = positionMaximum; prefix[index]; index-- ){
if ( index % mainPeriodLength == 0 ){
solution = index;
break;
}
}
if ( solution == lengthText )
solution--;
fout << solution << "\n";
}
return 0;
}