Cod sursa(job #1883807)

Utilizator DanyBvGeorge-Daniel Gagiu DanyBv Data 18 februarie 2017 11:18:15
Problema PScPld Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <iostream>
#include <cstdio>

#define NMAX 1000001

using namespace std;

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

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

void solve()
{
    LPS[0] = 0;
    LPS[1] = 1;
    C = 1;
    R = 2;
    for(int i = 2; i < N; i++)
    {
        int ii = (C << 1) - 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(A[i - LPS[i] - 1] == A[i + LPS[i] + 1])
                LPS[i]++;
            else
                break;
        }
        //Stop expand
        if(i + LPS[i] > R)
        {
            R = i + LPS[i];
            C = i;
        }
    }
    for(int i = 1; i < N - 1; i++)
        nr += ((LPS[i] + 1) >> 1);
}

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

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