Cod sursa(job #2023280)

Utilizator Alex18maiAlex Enache Alex18mai Data 18 septembrie 2017 17:51:07
Problema PScPld Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>

using namespace std;

ifstream cin("pscpld.in");
ofstream cout("pscpld.out");

long long poli[1000100];

int main() {

    string s;
    cin>>s;
    string sir;
    for (long long i=0; i<s.size(); i++){
        sir += '#';
        sir += s[i];
    }
    sir += '#';
    //cout<<sir<<'\n';
    long long pos = 0;
    for (auto &x : poli){
        x++;
    }
    for (long long i=1; i<sir.size(); i++){
        if (pos * 2 - i >= 0 && pos * 2 - i - poli[ pos * 2 - i] > pos - poli[pos]){
            poli[i] = poli[ pos * 2 - i];
            continue;
        }
        long long intrare = i+1;
        if (pos + poli[pos] - 1 > i){
            intrare = i + 1 + pos + poli[pos] - 1 - i;
            poli[i] += pos + poli[pos] - 1 - i;
        }
        for (long long j=intrare; j<sir.size(); j++){
            if (2 * i - j >= 0 && sir[j] == sir[ 2 * i - j]){
                poli[i]++;
            }
            else{
                break;
            }
        }
        pos = i;
    }
    long long cont = 0;
    for (long long i=0; i<sir.size(); i++){
        if (sir[i + poli[i] - 1] != '#'){
            poli[i] ++;
        }
        //cout<<poli[i] / 2<<" ";
        cont += poli[i] / 2 ;
    }
    cout<<cont;
    return 0;
}