Cod sursa(job #479666)

Utilizator CezarMocanCezar Mocan CezarMocan Data 24 august 2010 19:22:52
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.78 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;

	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] - 1 > right) {
				right = i + lung[i] - 1;
				mid = i;
			}

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

		sol += lung[i];
	}


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