Cod sursa(job #468108)

Utilizator irene_mFMI Irina Iancu irene_m Data 2 iulie 2010 12:28:09
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <cstdio>
#define infile "numarare.in"
#define outfile "numarare.out"
#define MaxN 100024

int a[MaxN], sol[MaxN];
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;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<=N && a[i-l+3]+a[i+l]==a[i+l+2]+a[i-l+1])
                        l++;

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

            sol[1]+=sol[i];
      }

}

void write()
{
      int i,s=0;
      printf("%d\n",sol[1]+N-1);
}

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

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

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