Pagini recente » Cod sursa (job #1963454) | Cod sursa (job #3135426) | Cod sursa (job #574502) | Cod sursa (job #1023582) | Cod sursa (job #2039959)
#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);
}