Cod sursa(job #1162483)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 31 martie 2014 20:45:24
Problema Numarare Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector <int> v;
int n,i,nr,mij,dr,mij2,dr2,sum,equiv,dp[200015],k;
int main(void)
{
    FILE * f;
    f=fopen("numarare.in","r");
    ofstream g("numarare.out");
    fscanf(f,"%d",&n);
    for (i=1;i<=n;i++)
    {
        fscanf(f,"%d",&nr);
        v.push_back(nr);
        v.push_back(-1);
        //cout<<nr<<' '<<-1<<' ';
    }
    v.pop_back();
    //cout<<'\n';
    mij=dr=-1;
    //cout<<"0 ";
    for (i=1;i<v.size();i++)
    {
        if (v[i]==-1)
        {
            if (i>=dr)
            {
                mij=i;
                dr=1;
                sum=v[mij+dr]+v[mij-dr];
                while ((v[mij+dr]+v[mij-dr]==sum)&&(mij+dr<v.size())&&(mij-dr>=0))
                    dr=dr+2;
                dp[i]=dr;
                dr=dr-2;
            }
            else
            {
                equiv=i-mij;
                mij2=i;
                dr2=min(dr,dp[equiv]+i);
                sum=v[mij2+dr2]+v[mij2-dr2];
                while ((v[mij2+dr2]+v[mij2-dr2]==sum)&&(mij+dr2<v.size())&&(mij-dr2>=0))
                    dr2=dr2+2;
                dp[i]=dr2;
                dr2=dr2-2;
                if (dr2>dr)
                {
                    dr=dr2;
                    mij=mij2;
                }
            }
        }
        //cout<<dp[i]<<' ';
        k=k+dp[i]/2;
    }
    g<<k<<'\n';
    g.close();
    return 0;
}