Cod sursa(job #1734770)

Utilizator danutbodbodnariuc danut danutbod Data 28 iulie 2016 11:10:55
Problema Numarare Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.97 kb

//#include <iostream>
//#include <cstdio>
//#include <cstring>
//#include <vector>
//#include <algorithm>
//#include <cmath>
//
//using namespace std;
//
//#define mp make_pair
//#define pb push_back
//#define ll long long
//
//#define maxN 100011
//#define inf 1000000
//
//int n, i;
//int v[maxN];
//ll ans;
//
//int len[maxN];
//int C, fin;
//
//int main()
//{
//    freopen("numarare.in","r",stdin);
//    freopen("numarare.out","w",stdout);
//
//    scanf("%d", &n);
//    for (i = 1; i <= n; i++)
//        scanf("%d", &v[i]);
//    v[0] = v[n + 1] = -inf;
//
//
//    C = fin = 0;
//    for (i = 1; i < n; i++) {
//        if (i + 1 <= fin) len[i] = min(len[2 * C - i], fin - i);
//        while (v[i] + v[i + 1] == v[i + 1 + len[i]] + v[i - len[i]]) len[i]++;
//        ans += 1LL * len[i];
//
//        if (i + len[i] >= fin) {
//            C = i;
//            fin = i + len[i];
//        }
//    }
//
//    printf("%lld", ans);
//
//    return 0;
//}
#include <fstream>
using namespace std;
ifstream fi("numarare.in");
ofstream fo("numarare.out");
#define MAXN 100003
#define inf 1000000
int n, i,st,dr;
int a[MAXN];
int lg[MAXN];
long long sol;
int main()
{
    fi>>n;
    for (i = 1; i <= n; i++)  fi>>a[i];
    a[0]=a[n+1]=-inf;
    st=dr=0;
    for (i = 1; i < n; i++) {
        if (i + 1 <= st) lg[i] = min(lg[2 * st - i], dr - i);
        while(a[i]+a[i+1]==a[i-lg[i]]+a[i+1+lg[i]]) lg[i]++;
        sol += 1LL*lg[i];

        if (i+lg[i]>=st) {
            st=i;
            dr=i+lg[i];
        }
    }
  fo<<sol<<'\n';
  return 0;
}

//#include<fstream>//10p timp depasit!?!
//using namespace std;
//ifstream fi("numarare.in");
//ofstream fo("numarare.out");
//int sum,st,dr,i,n,a[100002],lg[100002];
//int main()
//{
//    fi>>n;
//    for(i=1;i<=n;++i) fi>>a[i];
//    for(i=1;i<n;i++)
//    {
//        st=i;dr=i+1;sum=a[st]+a[dr];
//        while(st>0 && lg[st]<=1 && a[st]+a[dr]==sum)st--,dr++;
//        st++;dr--;
//        lg[i]=dr-i;
//    }
//    //for(i=1;i<=n;i++)fo<<lg[i]<<" ";fo<<endl;
//    for(i=1;i<n;i++)
//     if(lg[i]>1)
//      {
//        sum=a[i]+a[i+1];
//        while(a[i-lg[i]]+a[i+1+lg[i]]==sum)
//            lg[i]+=min(lg[i-lg[i]],a[i-lg[i]]);
//       }
//    //for(i=1;i<=n;i++)fo<<lg[i]<<" ";fo<<endl;
//    long long sol=0;
//    for(i=1;i<=n;i++)sol+=lg[i];
//    fo<<sol<<'\n';
//    return 0;
//    }
//#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;
//}