Cod sursa(job #2437482)

Utilizator IoanaDraganescuIoana Draganescu IoanaDraganescu Data 9 iulie 2019 17:03:56
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <iostream>
#include <fstream>

using namespace std;

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

char a[1000005], c[2000005];
int d[2000005];

int main()
{
    fin >> a;
    int n = 0;
    c[0] = '-';
    for (int i = 0; a[i]; i++){
        c[++n] = a[i];
        c[++n] = '-';
    }
    n--;
    int centru = 0;
    long long sol = 0;
    for (int i = 0; i <= n + 1; i++){
        int i2 = 2 * centru - i;
        if (i < centru + d[centru])
            d[i] = i2 - max(i2 - d[i2], centru - d[centru]);
        while (i + d[i] <= n + 1 && i - d[i] >= 0){
            if (c[i + d[i]] == c[i - d[i]])
                d[i]++;
            else
                break;
        }
        if (i + d[i] > centru + d[centru])
            centru = i;
        d[i]--;
        if (c[i] == '-')
            sol += d[i] / 2;
        else
            sol += d[i] / 2 + 1;
    }
    fout << sol << '\n';
    return 0;
}