Cod sursa(job #2631015)

Utilizator vladm98Munteanu Vlad vladm98 Data 28 iunie 2020 15:48:55
Problema PScPld Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;

int manacher[2000006];

int main()
{
    ifstream fin ("pscpld.in");
    ofstream fout ("pscpld.out");
    string s, initialS;
    fin >> initialS;
    s = "&&"; //pun de 2 ori caracterul special pentru ca vreau indexare de la 1.
    for (auto x : initialS) {
        s += x;
        s += "&";
    }

    int middle = 0;
    for (int i = 1; i < s.size(); ++i) {
        if (middle + (manacher[middle] - 1) / 2 >= i) {
            manacher[i] = min(manacher[middle - (i - middle)], 2 * (middle + (manacher[middle] - 1) / 2 - i) + 1);
            while (i + (manacher[i] - 1) / 2 + 1 < s.size() and i - (manacher[i] - 1) / 2 - 1 >= 1 and s[i + (manacher[i] - 1) / 2 + 1] == s[i - (manacher[i] - 1) / 2 - 1]) {
                manacher[i] += 2;
            }
            if (i + (manacher[i] - 1) / 2 >= middle + (manacher[middle] - 1) / 2) {
                middle = i;
            }
        } else {
            manacher[i] = 1;
            while (i + (manacher[i] - 1) / 2 + 1 < s.size() and i - (manacher[i] - 1) / 2 - 1 >= 1 and s[i + (manacher[i] - 1) / 2 + 1] == s[i - (manacher[i] - 1) / 2 - 1]) {
                manacher[i] += 2;
            }
            middle = i;
        }
    }

    long long answer = 0;
    for (int i = 1; i < s.size(); ++i) {
        answer += ((manacher[i] - 1) / 2 + 1) / 2;
    }
    fout << answer;
    return 0;
}