Pagini recente » Cod sursa (job #16345) | Cod sursa (job #3031760) | Cod sursa (job #182976) | Istoria paginii runda/carnedecal | Cod sursa (job #1523879)
#include <cstdio>
#include <cctype>
#define INF 1000000000
#define BUF_SIZE 4096
#define MAXN 100000
int v[MAXN+1], n, d[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;
char ch=nextch();
while(!isdigit(ch)){
ch=nextch();
}
while(isdigit(ch)){
x=10*x+ch-'0';
ch=nextch();
}
return x;
}
inline long long manacher(){
int o=0, r=0, i;
long long ans=0;
v[0]=INF;
v[n+1]=-INF;
for(i=1; i<=n; i++){
if(r>i){
if(i+d[2*o-i]<=r){
d[i]=d[2*o-i];
}else{
d[i]=r-o+1;
}
}else{
d[i]=1;
}
while(v[i+d[i]]==v[i-d[i]]){
d[i]++;
}
if(i+d[i]-1>r){
o=i;
r=i+d[i]-1;
}
ans+=d[i];
}
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;
}