Cod sursa(job #1523896)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 13 noiembrie 2015 14:11:39
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#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;
}