Pagini recente » Cod sursa (job #1230617) | Cod sursa (job #2682670) | Cod sursa (job #106913) | Cod sursa (job #214878) | Cod sursa (job #1523896)
#include <cstdio>
#include <cctype>
#define INF 1000000000
#define BUF_SIZE 4096
#define MAXN 100000
int v[MAXN+1], n, p[MAXN+1];
int pos=BUF_SIZE;
char buf[BUF_SIZE];
FILE *fin;
inline char nextch(){
if(pos==BUF_SIZE){
fread(buf, BUF_SIZE, 1, fin);
pos=0;
}
return buf[pos++];
}
inline int read(){
int x=0, s=1;
char ch=nextch();
while((!isdigit(ch))&&(ch!='-')){
ch=nextch();
}
if(ch=='-'){
s=-1;
ch=nextch();
}
while(isdigit(ch)){
x=10*x+ch-'0';
ch=nextch();
}
return x*s;
}
inline long long manacher(){
int c=0, r=0, i, j;
long long ans=0;
v[0]=INF;
v[n+1]=-INF;
for(i=1; i<=n; i++){
j=2*c-i;
if(r>i){
if(p[j]<=r-i){
p[i]=p[j];
}else{
p[i]=r-i;
}
}
while(v[i+p[i]+1]==v[i-p[i]-1]){
p[i]++;
}
if(i+p[i]>r){
c=i;
r=i+p[i];
}
ans+=p[i]+1;
}
return ans;
}
int main(){
int x, y, i;
FILE *fout;
fin=fopen("numarare.in", "r");
fout=fopen("numarare.out", "w");
n=read()-1;
x=read();
for(i=1; i<=n; i++){
y=read();
v[i]=y-x;
x=y;
}
fprintf(fout, "%lld\n", manacher());
fclose(fin);
fclose(fout);
return 0;
}