Cod sursa(job #1926150)

Utilizator cordun_cristinaCristina Maria Cordun cordun_cristina Data 13 martie 2017 23:47:26
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;
ifstream f("pscpld.in");
ofstream g("pscpld.out");

char s[1000005];
int n, p, r, DP[2][1000005], lef_t, righ_t;
long long sol;

void Read()
{
    f>>s;
    n = strlen(s);
    for(int i = n; i > 0; i--) s[i] = s[i-1];
}

int Expand(int li, int ls)
{
    int cont = 0;
    while(s[li] == s[ls] && li > 0 && ls <= n)
    {
        li--;
        ls++;
        cont++;
    }
    return cont;
}

void SolveOdd()
{
    p = r = 0;
    for(int i = 1; i <= n; i++)
    {
        if(i <= r) DP[0][i] = min(DP[0][p-(i-p)], r-i);
        lef_t = i-DP[0][i];
        righ_t = i+DP[0][i];
        DP[0][i]+=Expand(lef_t, righ_t);
        if(DP[0][i]+i>r)
        {
            p = i;
            r = i+DP[0][i];
        }
        sol += (long long) DP[0][i];
    }
}

void SolveEven()
{
    p = r = 0;
    for(int i = 1; i <= n; i++)
    {
        if(s[i]!=s[i+1]) continue;
        if(i <= r) DP[0][i] = min(DP[0][p-(i-p)], r-i-1);
        lef_t = i-DP[0][i];
        righ_t = i+DP[0][i]+1;
        DP[0][i]+=Expand(lef_t, righ_t);
        if(DP[0][i]+i+1>r)
        {
            p = i;
            r = i+DP[0][i]+1;
        }
        sol += (long long) DP[0][i];
    }
}

void Print()
{
    g<<sol<<'\n';
}

int main()
{
    Read();
    SolveOdd();
    SolveEven();
    Print();
    return 0;
}