Cod sursa(job #468386)

Utilizator alex_dincaDinca Alexandru-Nicolae - UPB alex_dinca Data 3 iulie 2010 12:25:59
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <stdio.h>
#define min(a, b) (a) < (b) ? (a) : (b)
#define MAX_N 100010

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

int main() {
	int n, i, st, dr;
	freopen("numarare.in", "r", stdin);
	freopen("numarare.out", "w", stdout);
	scanf("%d", &n);
	scanf("%d", &A[1]);
	for (i = 2; i <= n; i++) {
		scanf("%d", &A[i]);
		d[i - 1] = A[i] - A[i - 1];
		lun[i - 1] = 1;
	}
	long long rez = 0;
	int mid = 1, right = 1;
	for (i = 1; i < n; i++) {
		if (right > i) 
			lun[i] = min(lun[mid - (i - mid)], right - i + 1);
		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;
		}
		rez = rez + lun[i];
	}
	printf("%lld\n", rez);
	return 0;
}