Cod sursa(job #3294658)

Utilizator horia.boeriuBoeriu Horia Andrei horia.boeriu Data 27 aprilie 2025 00:08:59
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#include <ctype.h>

#define MAXN 1000000
char v[2 * MAXN + 1];
int p[2 * MAXN + 1];
int minim(int a, int b) {
    return a < b ? a : b;
}
int main()
{
    FILE *fin, *fout;
    //manacher
    int n, i, dr, mij, st;
    long long rez;
    char ch;
    n = 1;
    v[0] = '#';
    fin = fopen("pscpld.in", "r");
    ch = fgetc(fin);
    while (isalpha(ch)) {
        v[n] = ch;
        v[n + 1] = '#';
        n += 2;
        ch = fgetc(fin);
    }
    fclose(fin);
    dr = mij = -1;
    rez = 0;
    for (i = 0; i < n; i++) {
        st = 2 * mij - i;
        if (st >= 0) {
            p[i] = minim(dr - i, p[st]);
        }
        while (i - p[i] - 1 >= 0 && i + p[i] + 1 < n && v[i - p[i] - 1] == v[i + p[i] + 1]) {
            p[i]++;
        }
        if (i % 2 > 0) {
            rez += p[i] / 2 + 1;//daca e litera
        } else {
            rez += p[i] / 2;//daca e #
        }
        if (i + p[i] > dr) {
            dr = i + p[i];
            mij = i;
        }
    }
    fout = fopen("pscpld.out", "w");
    fprintf(fout, "%lld\n", rez);
    fclose(fout);
    return 0;
}