Cod sursa(job #1003988)

Utilizator thewildnathNathan Wildenberg thewildnath Data 1 octombrie 2013 20:58:39
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include<stdio.h>
#include<string.h>

char s[2000002],v[2000002];
int m[2000002];

inline void ext(int i)
{
    while(s[i-m[i]-1]==s[i+m[i]+1]&&m[i]<i)
        ++m[i];
}

int main()
{
    freopen("pscpld.in","r",stdin);
    freopen("pscpld.out","w",stdout);
    int n,i,l=0,p=0;
    long long sol=0;
    scanf("%s",&v);
    n=strlen(v);
    s[0]='*';
    for(i=0;i<n;++i)
    {
        s[++p]=v[i];
        s[++p]='*';
    }
    n=p;
    ////////////////
    for(i=1;i<=n;++i)
    {
        if(l+m[l]<i)
            ext(i);
        else if(l-m[l]>=2*l-i-m[2*l-i])
        {
            m[i]=m[l]-i+l;
            ext(i);
        }
        else
            m[i]=m[2*l-i];
        if(i+m[i]>l+m[l])
            l=i;
        sol+=(long long)(m[i]+1)/2;
    }
    printf("%lld\n",sol);
    //printf("%s",s);
    return 0;
}