Cod sursa(job #479665)

Utilizator CezarMocanCezar Mocan CezarMocan Data 24 august 2010 19:21:12
Problema Numarare Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.79 kb
#include <cstdio>
#include <algorithm>

const int maxN = 100100;

using namespace std;

int V[maxN], D[maxN], lung[maxN];
int st, dr, right, mid, sol;
int N;

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

	scanf("%d", &N);
	for (i = 1; i <= N; i++) 
		scanf("%d", &V[i]);
	
	for (i = 1; i < N; i++)
		D[i] = V[i] - V[i + 1];


	right = mid = 1;
	lung[1] = 1;

	for (i = 1; i < N; i++) {
		if (right >= i)
			lung[i] = min(lung[mid - (i - mid)], right - i + 1);

		st = i - lung[i]; dr = i + lung[i];

		while (st > 0 && dr <= N) {
			if (i + lung[i] > right) {
				right = i + lung[i];
				mid = i;
			}

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

		sol += lung[i];
	}


	printf("%d\n", sol);
	return 0;
}