Cod sursa(job #466615)

Utilizator Mishu91Andrei Misarca Mishu91 Data 27 iunie 2010 12:01:02
Problema Numarare Scor 100
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 1 Marime 0.93 kb
#include <fstream>

using namespace std;

const int MAX_N = 200005;

ifstream fin ("numarare.in");
ofstream fout ("numarare.out");

int N, V[MAX_N], L[MAX_N], S[MAX_N], bst = 1;
long long Sol;

void citire() {
	fin >> N;
//	Sol = N-1;

	for(int i = 1; i <= N; ++i) {
		fin >> V[i];
	}

	for(int i = 2; i <= N; ++i) {
		S[2*i-3] = V[i] - V[i-1];
	}

	--N;
	N *= 2;
}

void solve() {
	for(int i = 1; i < N; ++i) {
		if(bst + L[bst] - 1 < i) {
			L[i] = (i & 1);
		} else {
			L[i] = min(L[2 * bst - i], bst + L[bst] - i);
		}
								              
		int j = L[i] + 1;
		while(i - j > 0 && i + j <= N && S[i + j] == S[i - j]) {
			j += 2;
		}

		L[i] = j - 1;

		if(i + L[i] > bst + L[bst]) {
			bst = i;
		}


		if((i & 1) == 1) {
			Sol += (L[i] + 1) >> 1;
		}
	}

/*	for(int i = 1; i <= N; ++i)
		fout << S[i] << " ";
	fout << "\n";
    for(int i = 1; i <= N; ++i)
    	fout << L[i] << " ";
*/
	fout << Sol;
}

int main() {
	citire();
	solve();
}