Cod sursa(job #2181467)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 21 martie 2018 18:07:19
Problema PScPld Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>
#include <cctype>
#include <cstring>
using namespace std;
char v[2000005],aux[1000005];
int rez[2000005];
/// TONI BO$$ was here
/// #MLC
int main()
{
    int n,fl,i,c,r,j,a,b;
    long long sum=0;
    freopen("pscpld.in","r",stdin);
    freopen("pscpld.out","w",stdout);
    gets(aux);
    n=strlen(aux)-1;
    for(i=0; i<=n; i++)
    {
        v[2*i]='$';
        v[2*i+1]=aux[i];
    }
    v[2*i]='$';
    n=2*i;
    c=1;
    r=2;
    rez[1]=1;
    for(j=2; j<n; j++){
        i=2*c-j;
        if(j>=r){
            a=j-1;
            b=j+1;
            while(a>=0 && b<=n){
                if(v[a]==v[b])
                    a--,b++,rez[j]++;
                else
                    break;}
            c=j;
            r=c+rez[c];
            continue ;
        }
        if(rez[i]<r-j || r==n){
            rez[j]=rez[i];
            continue ;
        }
        rez[j]=r-j;
        a=j-rez[j]-1;
        b=r+1;
        while(a>=0 && b<=n){
            if(v[a]==v[b])
                a--,b++,rez[j]++;
            else
                break;}
        if(r<j+rez[j]){
            c=j;
            r=c+rez[c];
        }
    }
    for(i=1; i<n; i++)
        sum+=((long long)rez[i]+1)/2;
    printf("%lld",sum);

    return 0;
}