Cod sursa(job #1126851)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 27 februarie 2014 10:04:58
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

const int Nmax = 1000004;

char sir[Nmax];
char S[2 * Nmax];
int P[2 * Nmax];

int N;

int main()
{
    ifstream f("pscpld.in");
    ofstream g("pscpld.out");

    f >> sir;
    N = strlen( sir );

    int NN = 0;

    S[ ++NN ] = '#';

    for ( int i = 0; i < N; ++i )
    {
        S[ ++NN ] = sir[i];
        S[ ++NN ] = '#';
    }

    int mx = 0, idx = 0;

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

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

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

    long long nr = 0;

    for ( int i = 1; i <= NN; ++i )
            nr += ( P[i] + 1 ) / 2LL;

    g << nr << "\n";
}