Cod sursa(job #678595)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 11 februarie 2012 23:18:00
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

#define NMax 1000005

using namespace std;

int N, DP[2][NMax];
char X[NMax];
long long S;

int Expand (int L, int R)
{
    int Length=0;
    for (; L>0 and R<=N and X[L]==X[R]; --L, ++R, ++Length);
    return Length;
}

void Solve (int T)
{
    int P=0, R=0;
    for (int i=1; i<=N; ++i)
    {
        if (T==1 and X[i]!=X[i+1])
        {
            continue;
        }
        if (R>=i+T)
        {
            DP[T][i]=min (DP[T][P-(i-P)], R-i-T);
        }
        DP[T][i]+=Expand (i-DP[T][i], i+T+DP[T][i]);
        if (i+T+DP[T][i]>R)
        {
            P=i;
            R=i+T+DP[T][i];
        }
        S+=((long long)DP[T][i]);
    }
}

void Read ()
{
    freopen ("pscpld.in", "r", stdin);
    scanf ("%s", X);
    N=strlen (X);
    for (int i=N; i>0; --i)
    {
        X[i]=X[i-1];
    }
}

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

int main()
{
    Read ();
    Solve (0);
    Solve (1);
    Print ();
    return 0;
}