Cod sursa(job #2166570)

Utilizator NeredesinI am not real Neredesin Data 13 martie 2018 17:48:31
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in("numarare.in");
ofstream out("numarare.out");

const int NMAX = 1e5;

int n, res;
int v[1 + NMAX];
int dp[1 + NMAX];

int main()
{
  in >> n;
  for(int i = 1; i <= n; i++)
    in >> v[i];
  for(int i = 1; i < n; i++)
    v[i] -= v[i + 1];
  n--;

  int from = 1;
  int to = 1;
  res = n;

  for(int i = 2; i <= n; i++) {
    if(i <= to) {
      dp[i] = min(to - i, dp[from + to - i]);
      if(dp[i] == to - i) {
        from = i - dp[i];
        to = i + dp[i];

        while(1 <= from && to <= n && v[from] == v[to]) {
          from--;
          to++;
        }

        from++;
        to--;

        dp[i] = (to - from + 1) / 2;
      }
    } else {
      from = to = i;

      while(1 <= from && to <= n && v[from] == v[to]) {
        from--;
        to++;
      }

      from++;
      to--;

      dp[i] = (to - from + 1) / 2;
    }

    res += dp[i];
  }

  out << res << '\n';

  in.close();
  out.close();
  return 0;
}