Cod sursa(job #2370400)

Utilizator andreisontea01Andrei Sontea andreisontea01 Data 6 martie 2019 11:57:49
Problema PScPld Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <bits/stdc++.h>

using namespace std;

string s;

void precalc(){
    string cps = "$";
    for(int i = 0; i < int(s.size()); ++i){
        cps += s[i];
        cps += '$';
    }
    s = cps;
}

int lps[1000005];
int n;

int main()
{
    ifstream fin("pscpld.in");
    ofstream fout("pscpld.out");
    ios_base::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);
    getline(fin, s);
    precalc();
    n = int(s.size());
    int l = 0, r = -1, currentlps = 0, sum = 0;
    for(int i = 0; i < n; ++i){
        if(i > r) currentlps = 1;
        else currentlps = min(r - i, lps[l + r - i]);
        while(i - currentlps >= 0 && i + currentlps < n && s[i - currentlps] == s[i + currentlps])
            currentlps++;
        lps[i] = currentlps;
        currentlps--;
        sum += lps[i] / 2;
        if(i + currentlps > r){
            r = i + currentlps;
            l = i - currentlps;
        }
    }
    fout << sum;
    return 0;
}