Cod sursa(job #2638166)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 27 iulie 2020 13:06:51
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
#include <string>

using namespace std;

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

const int NMAX = 2e6;

string s;
long long ans;

int manacher[NMAX + 2];

void Manacher()
{
    int drMax = 0, posDrMax = 0;

    for(int i = 1; i < (int)s.size() - 1; i++)
        {
            if(i > drMax)
                {
                    int st = i - 1, dr = i + 1;

                    while(st >= 0 && dr < (int)s.size() && s[st] == s[dr])
                        st--, dr++;

                    st++, dr--;
                    manacher[i] = dr - i;

                    drMax = dr;
                    posDrMax = i;
                }
            else
                {
                    if(i + manacher[2 * posDrMax - i] < drMax)
                        manacher[i] = manacher[2 * posDrMax - i];
                    else
                    {
                        int st = 2 * i - drMax, dr = drMax;

                        while(st >= 0 && dr < (int)s.size() && s[st] == s[dr])
                            st--, dr++;

                        st++, dr--;
                        manacher[i] = dr - i;

                        drMax = dr;
                        posDrMax = i;
                    }
                }

            if(s[i] == '*')
                ans += 1LL * (manacher[i] + 1) / 2;
            else
                ans += 1LL * (manacher[i] + 2) / 2;
        }
}

int main()
{
    string aux;
    cin >> aux;

    s += '*';
    for(auto it : aux)
        s += it, s += '*';

    Manacher();

    cout << ans << '\n';

    return 0;
}