Cod sursa(job #1883767)

Utilizator DanyBvGeorge-Daniel Gagiu DanyBv Data 18 februarie 2017 10:58:20
Problema PScPld Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <cstdio>

#define NMAX 1000001

using namespace std;

char       A[2 * NMAX + 1];
long long  LPS[2 * NMAX + 1], C, R, N, lmax, cmax, nr;

void read()
{
    freopen("pscpld.in", "r", stdin);
    A[N++] = '#';
    int c;
    while(!feof(stdin))
    {
        scanf("%c", &c);
        if(isalpha(c))
        {
            A[N++] = c;
            A[N++] = '#';
        }
    }
}

void solve()
{
    LPS[0] = 0;
    LPS[1] = 1;
    C = 1;
    R = 2;
    lmax = cmax = 1;
    for(int i = 2; i < N; i++)
    {
        int ii = 2 * C - i;
        if(R<i)
            LPS[i] = 0;
        else
            LPS[i] = min(R - i, LPS[ii]);
        //Start expand
        while(i - LPS[i] > 0 && i + LPS[i] < N)
        {
            if((i - LPS[i] - 1) % 2 == 0)
                LPS[i]++;
            else if(A[i - LPS[i] - 1] == A[i + LPS[i] + 1])
                LPS[i]++;
            else
                break;
        }
        //Stop expand
        if(lmax < LPS[i])
        {
            lmax = LPS[i];
            cmax = i;
        }
        if(i + LPS[i] > R)
        {
            R = i + LPS[i];
            C = i;
        }
    }
    for(int i = 1; i < N - 1; i ++)
        nr += ((LPS[i] + 1) / 2);
}

void print()
{
    freopen("pscpld.out", "w", stdout);
    printf("%lld", nr);
}

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