Cod sursa(job #1821908)

Utilizator ducu34Albastroiu Radu Gabriel ducu34 Data 3 decembrie 2016 21:22:01
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
//
//  main.cpp
//  Prefix
//
//  Created by Albastroiu Radu on 11/30/16.
//  Copyright © 2016 Albastroiu Radu. All rights reserved.
//

#include <iostream>
#include <iomanip>
#include <fstream>
#include <algorithm>
#include <unordered_map>
#include <vector>
#include <cstring>
#include <cmath>

using namespace std;

ifstream fin("prefix.in");
ofstream fout("prefix.out");

int main()
{
    int T;
    fin >> T;
    while(T--)
    {
        string key_word, aux;
        int match_key_word[1000007];
        aux = " ";
    
        fin >> key_word;
    
        key_word = aux + key_word;
    
        auto n = key_word.size();
    
        int k = 0;
        match_key_word[0] = 0;
        match_key_word[1] = 0;
    
        for(int i = 2; i < n; i++)
        {
            while(k && key_word[i] != key_word[k + 1])
                k = match_key_word[k];
        
            if(key_word[i] == key_word[k + 1])
                k++;
        
            match_key_word[i] = k;
        }
        
        int poz = 0;
        int lungime_max = 0;
        int Max = 0;
        int last = 0;
        for(int i = 2; i < n; i++)
        {
            last = i;
            if(match_key_word[i] == 1)
            {
                poz = i - 1;
                lungime_max = 1;
                while(i < n && match_key_word[i + 1] > match_key_word[i])
                {
                    lungime_max = max(lungime_max, match_key_word[i + 1]);
                    i++;
                }
                if(lungime_max >= poz)
                    Max = max(Max, (lungime_max/poz + 1) * poz);
            }
            if( i != last )
                i--;
        }
        
        fout << Max << "\n";
    }
    return 0;
}