Cod sursa(job #545744)

Utilizator LgregL Greg Lgreg Data 3 martie 2011 21:09:41
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int lung[101010];
int v[101010],N,st,dr,q;
int main()
{
freopen("numarare.in","r",stdin);
freopen("numarare.out","w",stdout);

scanf("%d",&N);
for(int i=1;i<=N;++i)
{
    scanf("%d",&v[i]);
}
    N--;
for(int i=1;i<=N;++i)
    v[i]-=v[i+1];
    lung[1]=0;
    st=1;
    dr=1;
    for(int i=2;i<=N;++i)
    {
     //   printf("%d",v[i]);
            if(i<=dr)
            {
            int q=st+dr-i;
            lung[i]=min(lung[q],dr-i);

            if(i+lung[i]==dr)
            {
                st=i-lung[i];
                dr=i+lung[i];
                while(dr<N&&st>1&&v[i-lung[i]-1]==v[i+lung[i]+1])
                    {
                    ++lung[i];
                    --st;
                    ++dr;
                    }
            }
            }
            else
            {

                st=dr=i;
                lung[i]=0;
                while(st>1&&dr<N&&v[i-lung[i]-1]==v[i+lung[i]+1])
                {
                    --st;
                    ++dr;
                    ++lung[i];
                }
            }

    }
    int S=0;
    for(int i=1;i<=N;++i)
    {
      S+=lung[i]+1;
    }
    printf("%d\n",S);


}