Cod sursa(job #2901917)

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

using namespace std;

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

char a[2000005];
int mn[2000005],n;

int main()
{
    char ch;
    n = 1;
    a[1] = '*';
    while (in >> ch)
    {
        a[n + 1] = ch;
        a[n + 2] = '*';
        n += 2;
    }
    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]++;
        }
        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]++;
            }
        }
    }
    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;
}