Cod sursa(job #2578956)

Utilizator driver71528@gmail.comTerec Andrei-Sorin [email protected] Data 11 martie 2020 19:19:15
Problema Prefix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("prefix.in");
ofstream g("prefix.out");
int t;
char a      [1000001];
int pi      [1000001];
int perioada[1000001];
void calculeazaPI()
{
    int i,j;
    pi[0]=0;
    j=0;
    i=1;
    while(a[i])
    {
        if(a[i]==a[j])
            pi[i++]=++j;
        else if(j)
            j=pi[j-1];
        else
            pi[i++]=0;
    }
}
int solve()
{
    calculeazaPI();
    int longest=0;
    for(int i=0;a[i];i++)
    {
        perioada[i]=0;
        int lungime = i-pi[i]+1;
        if(pi[i]==0)
            perioada[i]=0;
        else if(pi[i]*2 == i+1 + perioada[pi[i]-1] * lungime)
        {
            perioada[i]=perioada[pi[i]-1]+1;
            longest=max(longest,lungime*(perioada[i]+1));
        }
    }
    return longest;
}
int main()
{
    f>>t;
    for(int i=1;i<=t;i++)
    {
        f>>a;
        g<<solve()<<'\n';
    }
    f.close();
    g.close();
    return 0;
}