Cod sursa(job #2016413)

Utilizator TincaMateiTinca Matei TincaMatei Data 29 august 2017 12:54:35
Problema Numarare Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>

const int MAX_N = 100000;
int v[MAX_N], dif[2*MAX_N];
int d[2*MAX_N];
int main() {
  int n, n2;
  long long rez = 0LL;
  FILE *fin = fopen("numarare.in", "r");
  fscanf(fin, "%d", &n);
  rez = n - 1;
  for(int i = 0; i < n; ++i)
    fscanf(fin, "%d", &v[i]);
  fclose(fin);

  n2 = 0;
  for(int i = 0; i < n - 1; ++i) {
    dif[i * 2] = v[i + 1] - v[i];
    dif[i * 2 + 1] = -1;
  }
  n2 = 2 * n - 2;

  int st, cent, dr;
  st = cent = dr = 0;
  for(int i = 1; i < n2; ++i) {
    if(i > dr)
      st = cent = dr = i;
    else {
      d[i] = d[2 * cent - i];
      if(i + d[i] >= dr) {
        d[i] = dr - i;
        cent = i;
        st = cent - d[i];
        dr = cent + d[i];
      }
    }
    while(st - 1 > 0 && dr + 1 < n2 && dif[st - 1] == dif[dr + 1]) {
      ++d[cent];
      --st;
      ++dr;
    }

    if(i % 2 == 1)
      rez = rez + (d[i] + 1) / 2;
  }
  
  FILE *fout = fopen("numarare.out", "w");
  fprintf(fout, "%lld", rez);
  fclose(fout);
  return 0;
}