Cod sursa(job #1209170)

Utilizator ZenusTudor Costin Razvan Zenus Data 17 iulie 2014 11:36:45
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <cstdio>
#include <vector>

using namespace std;

#define UI unsigned int
#define NMAX (1<<24)
#define MOD 10003

UI N,positions,i,left,right,diferite,start,finish,limita;
UI A[NMAX],nxt[NMAX];
vector < UI > H[MOD];
bool is;
long long total;

UI function(UI step)
{
    if (step==N)
    {
        nxt[step]=N;
        return N;
    }

    if (A[step+1]!=A[step])
    {
        nxt[step]=step+1;
        return nxt[step];
    }

    ++positions;
    nxt[step]=function(step+1);
}

bool find(int X)
{
    int j;

    for (j=0;j<H[X%MOD].size();++j)
    if (H[X%MOD][j]==X)
    return true;

    return false;
}

int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);

scanf("%u%u%u",&N,&left,&right);

for (i=1;i<=N;++i)
scanf("%u",&A[i]);

for (i=1;i<N;)
{
    if (A[i+1]!=A[i])
    {
        nxt[i]=i+1;
        ++i;
        continue;
    }

    positions=1;
    nxt[i]=function(i+1);
    i+=positions;
}
nxt[N]=N;

i=1;
while (diferite<left && i<=N)
{
    is=find(A[i]);

    if (!is)
    {
        ++diferite;
        H[A[i]%MOD].push_back(A[i]);
    }

    ++i;
}

start=i-1;

for (i=0;i<MOD;++i)
while (!H[i].empty()) H[i].pop_back();

i=1;
diferite=0;
while (diferite<=right && i<=N)
{
    is=find(A[i]);

    if (!is)
    {
        ++diferite;
        H[A[i]%MOD].push_back(A[i]);
    }

    ++i;
}

finish=i-1;

for (i=0;i<MOD;++i)
while (!H[i].empty()) H[i].pop_back();

i=N;
diferite=0;

while (diferite<left && i>=1)
{
    is=find(A[i]);

    if (!is)
    {
        ++diferite;
        H[A[i]%MOD].push_back(A[i]);
    }

    --i;
}

limita=i+1;

total=finish-start+1;

for (i=2;i<=limita;++i)
{
    if (A[i]==A[i-1])
    {
        total+=finish-start+1;
        continue;
    }
    start=nxt[start];
    finish=nxt[finish];
    total+=1LL*(finish-start+1);
}

printf("%lld\n",total);

return 0;
}