Cod sursa(job #2592168)

Utilizator Tudor06MusatTudor Tudor06 Data 1 aprilie 2020 12:29:16
Problema PScPld Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <iostream>
#include <fstream>

using namespace std;

const int NMAX = 1000000;

int manacher[2 * NMAX + 1];

int main() {
    ifstream fin( "pscpld.in" );
    ofstream fout( "pscpld.out" );
    int i, n, length_so_far = 0, poz = 0, st, dr, length;
    string s = "#";
    char ch;
    while ( fin >> ch ) {
        s += ch;
        s += '#';
    }
    n = s.size();
    for ( i = 1; i < n; i ++ ) {
        if ( poz + length_so_far < i ) {
            st = i - 1;
            dr = i + 1;
            length = 0;
            while ( st >= 0 && dr < n && s[st] == s[dr] ) {
                st --;
                dr ++;
                length ++;
            }
            manacher[i] = length;
        } else {
            manacher[i] = min( poz + length_so_far - i, manacher[poz - ( i - poz )] );
            st = i - manacher[i] - 1;
            dr = i + manacher[i] + 1;
            while ( st >= 0 && dr < n && s[st] == s[dr] ) {
                st --;
                dr ++;
                manacher[i] ++;
            }
        }
        if ( manacher[i] + i >= length_so_far + poz ) {
            length_so_far = manacher[i];
            poz = i;
        }
    }
    long long palindrome = 0;
    for ( i = 1; i < n; i ++ ) {
        if ( s[i] != '#' ) {
            palindrome += manacher[i] / 2;
        } else {
            palindrome += manacher[i] / 2 + 1;
        }
    }
    fout << palindrome;
    return 0;
}