Cod sursa(job #468263)

Utilizator savimSerban Andrei Stan savim Data 2 iulie 2010 21:52:41
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define MAX_N 100010

int A[MAX_N], d[MAX_N], lun[MAX_N];

int main() {
	
	freopen("numarare.in", "r", stdin);
	freopen("numarare.out", "w", stdout);

	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &A[i]);
	
		if (i > 1) {
			d[i - 1] = A[i] - A[i - 1];
			lun[i - 1] = 1;
		}
	}

	long long sol = 0;
	int mid = 1, right = 1;
	for (int i = 1; i < n; i++) {
		if (right > i) 
			lun[i] = min(lun[mid - (i - mid)], right - i + 1);

		int st = i - lun[i], dr = i + lun[i];

		while (st > 0 && dr < n) {
			if (i + lun[i] - 1 > right) {
				right = i + lun[i] - 1;
				mid = i;
			}

			if (d[st] == d[dr]) {
				lun[i]++;
				st--; dr++;
			}
			else break;
		}

		sol = sol + lun[i];
	}

	printf("%lld\n", sol);

	return 0;
}