Cod sursa(job #466724)

Utilizator katakunaCazacu Alexandru katakuna Data 27 iunie 2010 13:45:29
Problema Numarare Scor 100
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 1 Marime 1.02 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define Nmax 100010

int n, N;
int v[Nmax], d[Nmax], L[Nmax], x[Nmax];

void citire () {
	
	scanf ("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf ("%d", &x[i]);
		if (i >= 3)
			d[i - 2] = x[i] - x[i-2];
	}
}

void palind () {

	int i, pal;
	pal = 1;
	if (d[1] == d[2]) 
		L[1] = 1;
	
	for (i = 2; i <= N; i++) {
		if (i < pal + L[pal]) {
			L[i] = min(L[pal - (i - pal)], pal + L[pal] - i);
		}
		
		if (pal + L[pal] <= i + L[i]) {
			pal = i;
			while (i - (L[i] + 1) + 1 >= 1 && i + (L[i] + 1) <= N && d[i + (L[i] + 1)] == d[i - (L[i] + 1) + 1] ) {
				L[i]++;
			}
		}
	}
}

void rezolva () {
	
	long long sol = n - 1;
	
	for (int i = 1; i <= N; i++) 
		sol+= L[i];
	
	printf ("%lld", sol);
}

int main () {

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

	citire ();
	N = n - 2;
	
	palind ();
	rezolva ();
	
	/*for (int i = 1; i <= n; i++)
		printf ("%d ", L[i]);*/
	
	return 0;
}