Cod sursa(job #493154)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 17 octombrie 2010 13:25:29
Problema Numarare Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>

#define file_in "numarare.in"
#define file_out "numarare.out"

#define nmax 101000

int n;
int a[nmax];
int l[nmax];
int sol;

void adfile(void){
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d", &n);
	for (int i=1;i<=n;++i)
		 scanf("%d", &a[i]),
		 a[i-1]-=a[i];
		 
	n--;
	
	fclose(stdin);
	
	return ;
	
}

inline int min(int a, int b) { return a<b?a:b; }

void solve(){
	
	int i,st,dr;
	
	st=1;
	dr=1;
	
	for (i=1;i<=n;++i)
	{
		if (i<=dr){		
			l[i]=min(l[st-dr+1],dr-i);
			if (i+l[i]==dr){
				st=i-l[i];
				dr=i+l[i];
				while(st>1 && dr<n && a[i-l[i]-1]==a[i+l[i]+1]){
					l[i]++;
					st--;
					dr++;
				}
			}
		}
		else{
			l[i]=0;
			st=i;
			dr=i;
			while(st>1 && dr<n && a[i-l[i]-1]==a[i+l[i]+1]){
					l[i]++;
					st--;
					dr++;
				}
		}
	}
	
	sol=0;
	for (i=1;i<=n;++i)
		 sol+=l[i]+1;
	
	printf("%d\n", sol);
	
}

			
					
				
			
		

int main(){
	
	adfile();
	solve();
	
	return 0;
	
	
}