Cod sursa(job #2843369)

Utilizator PopaMihaimihai popa PopaMihai Data 2 februarie 2022 12:55:24
Problema PScPld Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1e6 + 2;

int z[NMAX];
long long ans;
string a, S;

int mymin(int a, int b)
{
    return (a < b ? a : b);
}

int main()
{
    fin >> a;
    int sz = a.size();
    S.push_back('$');
    for(int i = 0; i < sz; i++) {
        S.push_back(a[i]);
        S.push_back('$');
    }
    S.pop_back();

    int L = 0, R = 0;
    int n = S.size();
    z[1] = 1;

    for(int i = 2; i < n; ++i) {
        if(i <= R) {
            z[i] = mymin(R - i + 1, z[R + L - i]);
        }
        else z[i] = 1;

        while(i - z[i] > 0 && i + z[i] < n + 1 && S[i - z[i]] == S[i + z[i]])
            ++z[i];

        if(i + z[i] - 1 > R) {
            R = i + z[i] - 1;
            L = i - z[i] + 1;
        }
    }

    for(int i = 1; i < n; i++) {
        if(S[i] == '$')
            ans += ((z[i] - 1) >> 1);
        else ans += ((z[i] + 1) >> 1);
    }

    fout << ans << '\n';

    return 0;
}