Cod sursa(job #468119)

Utilizator irene_mFMI Irina Iancu irene_m Data 2 iulie 2010 12:53:26
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdio>
#define infile "numarare.in"
#define outfile "numarare.out"
#define MaxN 100024

int a[MaxN], sol[MaxN];
long long rez;
int N;

void read()
{
      int i;
      scanf("%d",&N);
      for(i=1;i<=N;i++)
      {
            scanf("%d",&a[i]);
            //sol[i]=1;
      }
}

int minim(int a,int b)
{
      if(a<b)
            return a;
      return b;
}

void solve()
{
      int i,l,s,last=1;

      if(a[1]+a[4]==a[2]+a[3])
            sol[1]=1;

      for(i=2;i<N-2;i++)
      {
            if(i<last+sol[last])
                  sol[i]=minim(sol[last-(i-last)],last+sol[last]-i);

            l=sol[i];
            if(last+sol[last]<=i+sol[i])
            {
                  last=i;

                  while(i-l+1>=1 && i+l+2<=N && a[i-l+3]+a[i+l]==a[i+l+2]+a[i-l+1])
                        l++;

                  if(l>0)
                        sol[i]=l-1;
            }

      }

      rez=N-1;
      for(i=1;i<=N;i++)
            rez+=sol[i];

}

void write()
{
      int i;
      printf("%lld\n",rez);
}

int main()
{
      freopen(infile,"r",stdin);
      freopen(outfile,"w",stdout);

      read();
      solve();
      write();

      fclose(stdin);
      fclose(stdout);
      return 0;
}