Cod sursa(job #997070)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 13 septembrie 2013 11:51:23
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

const int Nmax = 1000005;

int N;
char sir[2 * Nmax], ch;
int P[2 * Nmax];

void read()
{
    ifstream f("pscpld.in");

    sir[ ++N ] = '#';

    while ( true )
    {
        f.get( ch );

        if ( ch == '\n' )
                break;

        sir[ ++N ] = ch;
        sir[ ++N ] = '#';
    }

    f.close();
}

void Manacher()
{
    ofstream g("pscpld.out");

    int mx = 0, ind = 0;
    long long sol = 0;

    for ( int i = 1; i <= N; ++i )
    {
        if ( mx >= i )
        {
            P[i] = min( mx - i, P[2 * ind - i] );
        }

        while ( i - P[i] - 1 >= 0 && i + P[i] + 1 <= N &&
                sir[i - P[i] - 1] == sir[i + P[i] + 1]
              )
                    P[i]++;

        if ( i + P[i] > mx )
        {
            mx = i + P[i];
            ind = i;
        }
    }

    for ( int i = 1; i <= N; ++i )
            sol += ( P[i] + 1 ) / 2;

    g << sol << "\n";
}

int main()
{
    read();
    Manacher();

    return 0;
}