Cod sursa(job #2179161)

Utilizator IulianBobocBoboc Iulian IulianBoboc Data 19 martie 2018 23:20:11
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#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;
}