Cod sursa(job #1523885)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 13 noiembrie 2015 14:01:04
Problema Numarare Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 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, 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 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;
}