Cod sursa(job #2023273)

Utilizator Alex18maiAlex Enache Alex18mai Data 18 septembrie 2017 17:44:37
Problema PScPld Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>

using namespace std;

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

int poli[1000100];

int main() {

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