Cod sursa(job #1316051)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 13 ianuarie 2015 14:41:02
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<fstream>
#include<string>

using namespace std;

ifstream fin( "pscpld.in" );
ofstream fout( "pscpld.out" );

const int nmax = 2000001;
int d[ nmax + 1 ];
string s, aux;

void extend( int p ) {
    while ( p - d[ p ] >= 0 && p + d[ p ] < ( int )s.size() && s[ p - d[ p ] ] == s[ p + d[ p ] ] ) {
        ++ d[ p ];
    }
}
int main() {
    int j;
    fin >> aux;
    for( string::iterator it = aux.begin(); it != aux.end(); ++ it ) {
        s += "$";
        s += *it;
    }
    s += "$";
    aux.clear();
    j = 0;
    long long ans = 0;
    for( int i = 0; i < ( int )s.size(); ++ i ) {
        if ( i > j + d[ j ] ) {
            extend( i );
            j = i;
        } else {
            int k = 2 * j - i;
            if ( k - d[ k ] > j - d[ j ] ) {
                d[ i ] = d[ k ];
            } else {
                d[ i ] = k - (j - d[ j ]);
                extend( i );
            }
            if ( i + d[ i ] > j + d[ j ] ) {
                j = i;
            }
        }

        ans += ( long long )d[ i ] / 2;
    }
    fout << ans << "\n";
    fin.close();
    fout.close();
    return 0;
}