Cod sursa(job #2039959)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 15 octombrie 2017 11:27:29
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int INF = (1 << 30);

bool is_good(int i, int dist, int n) {
  return i + dist <= n and i - dist >= 1;
}

void solve(int n, vector < int > &v, vector < int > &manach) {

  int poz = -1;
  int max_r = -1;

  for (int i = 1; i < n; i ++) {
    if (v[i] != INF) {
      continue;
    }

    if (i > max_r) {
      int cur_dist = 1;
      int ref_sum = v[i + 1] + v[i - 1];
      while (v[i + cur_dist] + v[i - cur_dist] == ref_sum) { 
        cur_dist += 2;
        if (not is_good(i, cur_dist, n)) {
          break;
        }
      }

      cur_dist -= 2;
      poz = i;
      max_r = i + cur_dist;
      manach[i] = cur_dist;
      continue;
    }

    int k = manach[2 * poz - i];
    if (i + k < max_r) {
      manach[i] = k;
      continue;
    }

    int cur_dist = max_r - i;
    int ref_sum = v[i + 1] + v[i - 1];
    while (v[i + cur_dist] + v[i - cur_dist] == ref_sum) {
      cur_dist += 2;
      if (not is_good(i, cur_dist, n)) {
        break;
      }
    }

    cur_dist -= 2;
    poz = i;
    max_r = i + cur_dist;
    manach[i] = cur_dist;
  }

  long long sol = 0;
  for (int i = 1; i < n; i ++) {
    if (v[i] != INF) {
      continue;
    }

    sol += 1ll * ((manach[i] + 1) / 2);
  }

  cout << sol << '\n';
}

int main(int argc, char const *argv[]) {
  
  int n;
  cin >> n;
  int index = 0;
  vector < int > v(n * 2 + 7);

  for (int i = 1; i <= n; i ++) {
    cin >> v[++ index];
    v[++ index] = INF;
  }

  vector < int > manach(n * 2 + 7);
  solve(2 * n, v, manach);
}