Pagini recente » Cod sursa (job #1664301) | Cod sursa (job #2179161)
#include<fstream>
#include<cstring>
using namespace std;
#define maxLength 2000001
#define threshold 1000
#define min(a,b) (a < b ? a : b)
int i, j, pi[maxLength];
char A[maxLength];
void computePiFunction(char pattern[]) {
int k, patternLength = strlen(pattern);
pi[0] = -1;
k = -1;
for (i = 1; i < patternLength; ++i) {
while (k > -1 && pattern[k + 1] != pattern[i]) {
k = pi[k];
}
if (pattern[k + 1] == pattern[i]) {
k = k + 1;
}
pi[i] = k;
}
}
int main() {
ifstream inFile("prefix.in");
ofstream outFile("prefix.out");
int T;
inFile >> T;
for (int i = 0; i < T; ++i)
{
inFile >> A;
computePiFunction(A);
int lengthA = strlen(A), maxLongestPrefix = 0;
for (int i = lengthA -1; i > 0; --i)
{
int currentPrefixLength = i - pi[i];
if(pi[i] != -1 && (i + 1 ) % currentPrefixLength == 0 ){
int q = i;
int pq = pi[q];
while(pq >= 0 && (q + 1) % currentPrefixLength == 0){
q = pq;
pq = pi[q];
pi[q] = 0;
}
if(pq < 0){
maxLongestPrefix = i + 1;
break;
}
}
}
outFile << maxLongestPrefix <<"\n";
}
inFile.close();
outFile.close();
return 0;
}