Cod sursa(job #2430115)

Utilizator rd211Dinucu David rd211 Data 12 iunie 2019 19:55:09
Problema Prefix Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("prefix.in");
ofstream fout("prefix.out");
char pattern[1000010];
int helper[1000010];
int n;
short t;

void buildHelper()
{
    for(int i = 1,j=0;i<=n;i++)
    {
        while(j && pattern[i] != pattern[j])
            j = helper[j-1];

        if(pattern[i]==pattern[j])
            j++;
        helper[i]=j;
    }
}
void resetHelper()
{
    for(int i = 0;i<=n;i++)
        helper[i]=0;
}
void calcPrefix()
{
    int maxim = 0,indexMax = 0,patternSize=0;
    for(int i = 0;i<=n;i++)
    {
        if(maxim<helper[i])
        {
            maxim = helper[i];
            indexMax = i;
        }
    }
    for(int i = indexMax-1;i>=0;i--)
    {
        if(helper[i]!=helper[i+1]-1|| helper[i]==0){
            patternSize = i+1;
            break;
        }
    }
    if(maxim==0)
        fout<<0<<'\n';
    else if(maxim%patternSize == maxim)
        fout<<0<<'\n';
    else
        fout<<maxim -(maxim%patternSize) + patternSize<<'\n';
}
int main()
{
    int k;
    fin>>t;
    for(int i = 1; i<=t; i++)
    {
        fin>>pattern;
        for(k = 0; pattern[k]!='\0'; k++);
        n = k-1;
        buildHelper();
        calcPrefix();
        resetHelper();
    }
    fin.close();
    fout.close();
    return 0;
}