Cod sursa(job #1734764)

Utilizator danutbodbodnariuc danut danutbod Data 28 iulie 2016 10:22:33
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 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 += 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;
//    }