Cod sursa(job #3214959)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 14 martie 2024 16:30:54
Problema PScPld Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

const long long max_size = 2e6 + 20, rmax = 20;

long long p[max_size];

void solve ()
{
    string s, x;
    cin >> s;
    x += '$';
    for (long long i = 0; i < s.size(); i++)
    {
        x += s[i];
        x += '$';
    }
    long long n = x.size() - 1, dr = 0, poz = 0, ans = 0;
    for (long long i = 1; i <= n; i++)
    {
        long long y = 2 * poz - i;
        if (dr > y)
        {
            p[i] = min(dr - i, p[y]);
        }
        while (p[i] + 1 <= i && p[i] + i - 1 <= n && x[i - p[i] - 1] == x[i + p[i] + 1])
        {
            p[i]++;
        }
        if (i + p[i] > dr)
        {
            dr = i + p[i];
            poz = i;
        }
        if (i % 2 == 1)
        {
            ans += (p[i] + 1) / 2;
        }
        else
        {
            ans += p[i] / 2;
        }
    }
    cout << ans;
    cout << '\n';
}

signed main ()
{
#ifdef LOCAL
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#else
    freopen("deque.in", "r", stdin);
    freopen("deque.out", "w", stdout);
#endif // LOCAL
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    long long tt;
    //cin >> tt;
    tt = 1;
    while (tt--)
    {
        solve();
    }
    return 0;
}