Cod sursa(job #2299288)

Utilizator alextodoranTodoran Alexandru Raul alextodoran Data 9 decembrie 2018 11:33:54
Problema PScPld Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <bits/stdc++.h>

#define NM 1000002
#define ll long long

using namespace std;

string s;
int n;

int lg1[NM], lg2[NM];

int main()
{
    cin >> s;
    n = s.size();
    int pog = -1, p = -1, pt = -1;
    ll ans = 0;
    for(int i = 0; i < n; i++)
    {
        lg1[i] = 1;
        lg2[i] = 0;
        if(i <= pog)
            lg1[i] = min(lg1[p - (i - p) + pt], pog - i + 1);
        if(i < pog)
            lg2[i] = min(lg2[p - (i - p)], pog - i);
        while(i - lg1[i] >= 0 && i + lg1[i] < n && s[i - lg1[i]] == s[i + lg1[i]])
            lg1[i] += 1;
        while(i - lg2[i] >= 0 && i + lg2[i] + 1 < n && s[i - lg2[i]] == s[i + lg2[i] + 1])
            lg2[i] += 1;
        if(i + lg1[i] - 1 > pog)
        {
            pog = i + lg1[i] - 1;
            p = i;
            pt = 0;
        }
        if(i + lg2[i] > pog)
        {
            pog = i + lg2[i];
            p = i;
            pt = 1;
        }
        ans += lg1[i] + lg2[i];
    }
    cout << ans << "\n";
    return 0;
}