Cod sursa(job #2901918)

Utilizator andreiiorgulescuandrei iorgulescu andreiiorgulescu Data 14 mai 2022 20:06:16
Problema PScPld Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("pscpld.in");
ofstream out("pscpld.out");

vector<char>a;
int mn[2000005],n;

int main()
{
    char ch;
    a.push_back('v');
    a.push_back('*');
    while (in >> ch)
    {
        v.push_back(ch);
        v.push_back('*');
    }
    n = v.size();
    int l = 0,r = 0;
    for (int i = 1; i <= n; i++)
    {
        if (i > r)
        {
            l = i;
            mn[i] = 0;
            int st = i,dr = i;
            while (st > 1 and dr < n and a[st - 1] == a[dr + 1])
                st--,dr++,mn[i]++;
            r = i + mn[i];
        }
        else
        {
            int mid = (r + l) / 2;
            int ip = 2 * mid - i;
            int left = ip - l;
            if (mn[ip] < left)
                mn[i] = mn[ip];
            else
            {
                mn[i] = r - i;
                int dr = r;
                int st = 2 * i - r;
                while (st > 1 and dr < n and a[st - 1] == a[dr + 1])
                    st--,dr++,mn[i]++;
                r = i + mn[i];
                l = i - mn[i];
            }
        }
    }
    long long sum = 0;
    for (int i = 2; i <= n; i += 2)
        sum += 1 + mn[i] / 2;
    for (int i = 1; i <= n; i += 2)
        sum += mn[i] / 2;
    out << sum;
    return 0;
}