Cod sursa(job #1820486)

Utilizator stoianmihailStoian Mihail stoianmihail Data 1 decembrie 2016 20:00:19
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include <stdio.h>

#define MAX_N 100000

int N;
int s[MAX_N + 1];
int delta[MAX_N + 1];

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

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

  int last, curr;
  fscanf(f, "%d %d", &N, &last);
  for (i = 1; i < N; i++) {
    fscanf(f, "%d", &curr);
    s[i] = curr - last;
    last = curr;
  }

  /* Algoritmul lui Manacher. */
  long long int ans = 0;
  for (i = 1; i < N; i++) {
    if (i < r) {
      delta[i] = MIN(delta[2 * c - i], r - i);
    }
    while (i - delta[i] - 1 > 0 && i + delta[i] + 1 < N && s[i - delta[i] - 1] == s[i + delta[i] + 1]) {
      delta[i]++;
    }
    if (i + delta[i] > r) {
      r = i + delta[i];
      c = i;
    }
    ans += delta[i] + 1;
  }

  freopen("numarare.out", "w", stdout);
  fprintf(stdout, "%lld\n", ans);
  fclose(stdout);
  return 0;
}