Cod sursa(job #2650361)

Utilizator redstonegamer22Andrei Ion redstonegamer22 Data 18 septembrie 2020 15:20:37
Problema PScPld Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1000007;

string rd;
char s[2*NMAX + 7];
int lp[2*NMAX + 7];

int main()
{
    in >> rd;
    int n = rd.size();

    s[0] = '|';
    for(int i = 0; i < n; i++)
    {
        s[2*i + 1] = rd[i];
        s[2*i + 2] = '|';
    }

    for(int i = 0; i < 2*n+1; i++)
    {
        int len;
        for(len = lp[i]; i - len >= 0 && i + len < 2*n+1 && s[i-len] == s[i+len]; len++) {if(i - len >= 0 && i + len < 2*n+1 && s[i-len] == s[i+len]) lp[i] = len; }

        len = lp[i];

        for(int cpy = 1; cpy <= len; cpy++)
        {
            lp[i + cpy] = min(lp[i - cpy], max(0, (i - cpy) - (i - len) - 1));
        }
    }

    /*for(int i = 0; i < 2*n+1; i++)
        cout << lp[i] << " ";
    cout << endl;*/

    for(int i = 0; i < 2*n+1; i++)
    {
        int len;
        for(len = lp[i]; i - len >= 0 && i + len < 2*n+1 && s[i-len] == s[i+len]; len++) {if(i - len >= 0 && i + len < 2*n+1 && s[i-len] == s[i+len]) lp[i] = len; }
    }

    /*for(int i = 0; i < 2*n+1; i++)
        cout << lp[i] << " ";
    cout << endl;*/

    long long sum = 0;
    for(int i = 0; i < 2*n+1; i++)
    {
        if(i%2 == 1)
        {
            sum += (lp[i]+1)/2;
        }
        else
        {
            sum += (lp[i])/2;
        }
    }

    out << sum;
}