Cod sursa(job #1523870)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 13 noiembrie 2015 13:41:29
Problema Numarare Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#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){
            d[i]=d[2*o-i];
        }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;
}