Cod sursa(job #2606066)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 26 aprilie 2020 21:09:00
Problema Numarare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <fstream>

using namespace std;

ifstream cin("numarare.in");
ofstream cout("numarare.out");

const int NMAX = 100000;

int N, v[NMAX + 2], a[NMAX + 5];
int manacher[NMAX + 5];

void Manacher()
{
	int drMax = 0, posDrMax = 0;

	for(int i = 1; i <= N - 1; i++)
		if(i > drMax)
			{
				int st = i - 1, dr = i + 1;

				while(st >= 1 && dr <= N - 1  && a[st] == a[dr])
					st--, dr++;

				st++, dr--;

				manacher[i] = dr - i;
				drMax = dr, posDrMax = i;
			}
		else
			{
				if(i + manacher[2 * posDrMax - i] < drMax)
					manacher[i] = manacher[2 * posDrMax - i];
				else
					{
						int st = 2 * i - drMax, dr = drMax;
						
						while(st >= 1 && dr <= N - 1 && a[st] == a[dr])
							st--, dr++;

						st++, dr--;

						manacher[i] = dr - i;
						drMax = dr,  posDrMax = i;
					}
			}
}

int main()
{
	cin >> N;

	for(int i = 1; i <= N; i++)
		cin >> v[i];

	for(int i = 1; i <= N - 1; i++)
		a[i] = v[i + 1] - v[i];

	Manacher();

	long long sol = 0;
	for(int i = 1; i <= N - 1; i++)
		sol += (1ll * manacher[i] + 1);

	cout << sol << '\n';

	return 0;
}