Cod sursa(job #2586298)

Utilizator MocalinnoMoca Andrei Catalin Mocalinno Data 20 martie 2020 13:36:38
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <bits/stdc++.h>
using namespace std;
const int N(2e6);
string sir, s;
int v[N + 5], n, c, r;
int64_t res;
int main()
{
    std::ios::sync_with_stdio(false);
    freopen("pscpld.in", "r", stdin);
    freopen("pscpld.out", "w", stdout);
    cin >> sir;
    s += '#';
    for (const char& ch: sir)
    {
        s += ch;
        s += '#';
    }
    v[0] = 1;
    n = static_cast<int>(s.size());
    for (int i = 1; i < n; ++i)
    {
        int lg(0);
        if (i <= r)
            lg = min(v[2 * c - i], r - i + 1);
        while (i - lg >= 0 && i + lg < n && s[i - lg] == s[i + lg])
            ++lg;
        if (i + lg - 1 > r)
        {
            r = i + lg - 1;
            c = i;
        }
        v[i] = lg;
        if (i % 2 == 0)
            res += lg / 2;
        else res += (lg + 1) / 2;
    }
    cout << res;
    return 0;
}