Cod sursa(job #466855)

Utilizator AndreyPAndrei Poenaru AndreyP Data 27 iunie 2010 19:18:06
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#define ll long long
#define N 100010

int n;
int a[N];
int lun[N];
ll rez;

inline void citire()
{
	scanf("%d",&n);
	for(int i=1; i<=n; ++i)
		scanf("%d",&a[i]);
}

inline void rezolva()
{
	for(int i=1; i<n; ++i)
		a[i]-=a[i+1];
	int st=1;
	int dr=1;
	int aux;
	
	int n1=n-1;
	++rez;
	for(int i=2; i<n; ++i)
	{
		if(i<=dr)
		{
			aux=dr-i;
			if(i+lun[st+aux]>=dr)
			{
				lun[i]=dr-i;
				st=i-lun[i];
				dr=i+lun[i];
				while(st>1 && dr<n1 && a[st-1]==a[dr+1])
				{
					--st;
					++dr;
					++lun[i];
				}
			}
			else
				lun[i]=lun[st+aux];
		}
		else
		{
			st=dr=i;
			lun[i]=0;
			while(st>1 && dr<n1 && a[st-1]==a[dr+1])
			{
				--st;
				++dr;
				++lun[i];
			}
		}
		rez+=(ll)(lun[i]+1);
	}
}

int main()
{
	freopen("numarare.in","r",stdin);
	freopen("numarare.out","w",stdout);
	
	citire();
	if(n==1)
	{
		printf("0\n");
		return 0;
	}
	if(n==2)
	{
		printf("1\n");
		return 0;
	}
	rezolva();
	printf("%lld\n",rez);
	
	return 0;
}