Cod sursa(job #1162647)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 31 martie 2014 21:46:01
Problema Numarare Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
vector <int> v;
char s[600010];
int n,i,nr,mij,dr,mij2,dr2,equiv,dp[200015],k,sz,b;
int main(void)
{
    FILE * f;
    f=fopen("numarare.in","r");
    ofstream g("numarare.out");
    fscanf(f,"%d",&n);
    fgets(s,2,f);
    fgets(s,600005,f);
    v.reserve(200015);
    v.push_back(1000000000);
    v.push_back(-1);
    sz=strlen(s);
    i=0;
    while (i<sz)
    {
        nr=0;
        if (s[i]=='-')
        {
            b=-1;
            i++;
        }
        else
            b=1;
        while (('0'<=s[i])&&(s[i]<='9'))
        {
            nr=nr*10+s[i]-'0';
            i++;
        }
        i++;
        nr=nr*b;
        v.push_back(nr);
        v.push_back(-1);
    }
    v.push_back(1000000000);
    for (i=3;i<v.size()-2;i=i+2)
    {
        if (i>=mij+dr)
        {
            mij=i;
            dr=1;
            while (v[mij+dr+2]+v[mij-dr-2]==v[mij+dr]+v[mij-dr])
                dr=dr+2;
            dp[i]=dr;
        }
        else
        {
            equiv=2*mij-i;
            mij2=i;
            dr2=min(dr-(i-mij),dp[equiv]);
            while (v[mij2+dr2+2]+v[mij2-dr2-2]==v[mij2+dr2]+v[mij2-dr2])
                dr2=dr2+2;
            dp[i]=dr2;
            if (dr2>dr)
            {
                dr=dr2;
                mij=mij2;
            }
        }
        k=k+(dp[i]+1)/2;
    }
    g<<k<<'\n';
    g.close();
    return 0;
}