Cod sursa(job #2437662)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 9 iulie 2019 22:52:39
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.79 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int NMax = 1e6;

int DP[2 * NMax + 5], C, R, N;
char A[2 * NMax + 5], S[NMax + 5]; long long Sol;

int main()
{
    fin.getline(S, NMax + 5); A[0] = '*';

    for(int i = 0; S[i]; i++)
        A[++N] = S[i], A[++N] = '*';

    for(int i = 0; i <= N; i++)
    {
        if(i <= R) DP[i] = min(DP[C - (i - C)], R - i);

        while(i - DP[i] - 1 >= 0 && i + DP[i] + 1 <= N && A[i - DP[i] - 1] == A[i + DP[i] + 1])
            DP[i]++;

        Sol += ((A[i] == '*') ? DP[i] / 2 : DP[i] / 2 + 1);

        if(i + DP[i] > R)
            C = i, R = DP[i] + i;
    }
    fout << Sol << '\n';

    fin.close();
    fout.close();

    return 0;
}