Cod sursa(job #3290280)

Utilizator SfichiAndreiSfichi Andrei SfichiAndrei Data 29 martie 2025 19:11:25
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include <vector>
#include <string>

using namespace std;

// Funcție care transformă șirul inițial prin inserarea caracterului '#'
string transform(const string& s) {
    string t = "#";
    for (char c : s) {
        t += c;
        t += "#";
    }
    return t;
}

// Funcție care aplică algoritmul lui Manacher și calculează numărul total de subsecvențe palindromice
long long manacher(const string& s) {
    string t = transform(s);
    int n = t.size();
    vector<int> P(n, 0);
    int C = 0, R = 0;
    long long totalPalindromes = 0;

    for (int i = 0; i < n; i++) {
        int mirror = 2 * C - i;
        if (i < R)
            P[i] = min(R - i, P[mirror]);

        // Extindem palindromul centrat la i
        while (i - P[i] - 1 >= 0 && i + P[i] + 1 < n && t[i - P[i] - 1] == t[i + P[i] + 1])
            P[i]++;

        // Actualizăm centrul și marginea dreaptă
        if (i + P[i] > R) {
            C = i;
            R = i + P[i];
        }

        // Adăugăm numărul de palindroame centrate la i
        totalPalindromes += (P[i] + 1) / 2;
    }

    return totalPalindromes;
}

int main() {
    ifstream fin("pscpld.in");
    ofstream fout("pscpld.out");

    string s;
    fin >> s;

    long long result = manacher(s);
    fout << result << endl;

    fin.close();
    fout.close();

    return 0;
}