Cod sursa(job #1820480)

Utilizator stoianmihailStoian Mihail stoianmihail Data 1 decembrie 2016 19:49:35
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>
#include <ctype.h>

#define MAX_N 1000005

int N;
char s[2 * MAX_N];
int delta[2 * MAX_N];

int MIN(int X, int Y) {
  return X < Y ? X : Y;
}

int main(void) {
  int i, c = 0, r = 0;
  FILE *f = fopen("pscpld.in", "r");

  char curr;
  s[0] = '#';
  while (isalpha(curr = fgetc(f))) {
    s[++N] = curr;
    s[++N] = '#';
  }
  fclose(f);

  long long ans = 0;
  for (i = 1; i <= N; i++) {
    // Daca se afla in cadrul palindromului [c - delta[c], c + delta[c]].
    if (i < r) {
      delta[i] = MIN(delta[2 * c - i], r - i);
    }
    // Cauta mai multe palindroame centrate in pozitia "i".
    while (i - delta[i] - 1 >= 0 && i + delta[i] + 1 <= N && s[i - delta[i] - 1] == s[i + delta[i] + 1]) {
      delta[i]++;
    }
    // Imbunatateste cu un nou palindrom.
    if (i + delta[i] > r) {
      r = i + delta[i];
      c = i;
    }
    // Aduna la solutie.
    ans += (delta[i] + ((i & 1) == 0)) >> 1;
  }

  freopen("pscpld.out", "w", stdout);
  fprintf(stdout, "%lld\n", ans + N / 2);
  fclose(stdout);
  return 0;
}