Cod sursa(job #2589451)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 26 martie 2020 12:59:52
Problema Numarare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <bits/stdc++.h>

using namespace std;

#define int long long

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

vector <int> manacher(vector <int> v, bool par)
{
	int n = v.size();
	vector <int> best(n - !par);
	int l = 0;
	int r = 0;
	
	for(int i = 0; i < n - !par; ++i)
	{
		if(i + !par < r)
		{
			best[i] = min(best[l + r - i - !par], r - i);
		}
		
		int posl = i - best[i] + !par;
		int posr = i + best[i];
		
		while(posl - 1 >= 0 && posr + 1 < n && v[posl - 1] == v[posr + 1])
		{
			++posr;
			--posl;
			++best[i];
		}
		
		if(posr > r)
		{
			r = posr;
			l = posl;
		}
	}
	
	return best;
}

main()
{
	int n;
	fin >> n;
	
	vector <int> v(n);
	
	for(auto& i : v)
	{
		fin >> i;
	}
	
	for(int i = 0; i < n - 1; ++i)
		v[i] -= v[i + 1];
	
	v.pop_back();
	vector <int> impar = manacher(v, 1);
	int ans = 0;
	
	for(auto i : impar)
		ans += i + 1;
	
	fout << ans << '\n';
}