Cod sursa(job #1227533)

Utilizator lucian666Vasilut Lucian lucian666 Data 10 septembrie 2014 19:44:05
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb


#include <fstream>
#include <cstring>

#define MAXN 1000010
using namespace std;
ofstream out ("pscpld.out");


char S[MAXN];
int X[2 * MAXN];
int Best[MAXN * 2];

int main()
{

    ifstream in ("pscpld.in");

    int N, i, st, dr, right = -1, r, center = -1;
    long long Ans = 0;

    in >> (S + 1);
    N = strlen (S + 1);
    for (i = 1; i <= N; i ++)
        X[2 * i] = S[i] - 'a' + 1;
    N = 2 * N + 1;
    X[0] = -1;
    X[N + 1] = -2;

    for (i = 1; i <= N; i ++){
        st = dr = i;

        if (i > right)
            Best[i] = 0;
        else{
            r = i - center;
            Best[i] = Best[center - r];
            if (Best[i] > right - i)
                Best[i] = right - i;

            st -= Best[i];
            dr += Best[i];
        }

        while (X[st - 1] == X[dr + 1])
            Best[i] ++, st --, dr ++;

        if (dr > right)
            right = dr, center = i;

        Ans += (Best[i] + 1) / 2;
    }

    out << Ans;


    return 0;
}