Cod sursa(job #159242)

Utilizator sealTudose Vlad seal Data 14 martie 2008 00:11:39
Problema PScPld Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<stdio.h>
#define Nm (1<<20)
#define min(a,b) ((a)<(b)?(a):(b))
char S[Nm];
int A[Nm<<1];
long long ans;

void read()
{
    freopen("pscpld.in","r",stdin);
    gets(S);
}

void solve()
{
    int i,j;

    for(i=0;S[i];++i)
    {
        for(j=A[i<<1]+1;i-A[i<<1]>0 && S[i-A[i<<1]-1]==S[i+A[i<<1]+1];++A[i<<1]);
        for(;j<=A[i<<1];++j)
        {
            A[i+j<<1]=min(A[i-j<<1],A[i<<1]-j);
            A[(i+j<<1)-1]=min(A[i-j<<1|1],A[i<<1]-j+1);
        }
        ans+=j;

        for(j=A[i<<1|1]+1;i+1-A[i<<1|1]>0 && S[i-A[i<<1|1]]==S[i+A[i<<1|1]+1];++A[i<<1|1]);
        for(;j<=A[i<<1|1];++j)
        {
            A[i+j<<1]=min(A[i+1-j<<1],A[i<<1|1]-j);
            A[(i+j<<1)-1]=min(A[i+1-j<<1|1],A[i<<1|1]-j+1);
        }
        ans+=j-1;
    }
}

void write()
{
    freopen("pscpld.out","w",stdout);
    printf("%lld\n",ans);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}