Cod sursa(job #3288574)

Utilizator Dani111Gheorghe Daniel Dani111 Data 22 martie 2025 20:30:01
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <bits/stdc++.h>
using namespace std;

string s;
string t;

int main() {
    freopen("pscpld.in", "r", stdin);
    freopen("pscpld.out", "w", stdout);

    cin.tie(0); cout.tie(0);
    ios_base::sync_with_stdio(false);

    cin >> s;
    t += "$";
    for(auto i : s) {
        t += "#";
        t += i;
    }  
    t += "#";
    t += "^"; 

    auto manacher = [](string t) {
        long long ans = 0;
        int le = 1, ri = 1; //am o secventa palindromica (le + 1 ... ri - 1)
        vector<int>sz(t.size() + 1, 0); 
        //sz[i] -> cate secvente palindromice au mijlocul in i
        for(int i = 1; i < t.size() - 1; i++) {
            sz[i] = max(0, min(sz[le + (ri - i)], ri - i));
            while(t[i - sz[i]] == t[i + sz[i]]) { sz[i]++; }

            if(i + sz[i] > ri) {
                le = i - sz[i];
                ri = i + sz[i];
            }
            ans += (sz[i]) / 2;
        }   

        cout << ans;
    };

    manacher(t);

}