Cod sursa(job #614972)

Utilizator vlad2901Vlad Berindei vlad2901 Data 8 octombrie 2011 11:41:23
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>

#define MOD 666013
#define NMAX 1050000
#define MAXC 30000000

struct node
{
    int val, curentpoz;
    node *next;
} *H[MOD];

int v[NMAX];
int curent;
int n, l, u;
int ap[NMAX];

char s[MAXC];

int add(unsigned int val)
{
    node *newnode, *c;
    int key = val%MOD;

    for(c = H[key];c;c=c->next)
    {
        if(c->val == val)
        {
            return c->curentpoz;
        }
    }

    newnode = new node;
    newnode->val = val;
    newnode->curentpoz = curent++;
    newnode->next = H[key];
    H[key] = newnode;

    return curent-1;
}

long long nrsecv(int x) //numarul de secvente care contin cel mult x elemente distincte
{
    int nr = 0, i, l = 0;
    long long sum = 0;

    memset(ap, 0, sizeof(ap));

    for(i=0;i<n;++i)
    {
        if(ap[v[i]] == 0)
        {
            ++nr;
        }
        ++ap[v[i]];

        while(nr > x)
        {
            if(ap[v[l]] == 1)
            {
                --nr;
            }
            --ap[v[l]];
            ++l;
        }

        sum += i - l + 1;
    }

    return sum;

}

int main()
{
    int i;
    unsigned int x;

    char *cuv;

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

    scanf("%d %d %d", &n, &l, &u);
    curent = 1;

    fread(s, sizeof(char), MAXC, stdin);
    cuv = strtok(s, " \n");

    for(i=0;i<n;++i)
    {
        x = atol(cuv);
        v[i] = add(x);
        cuv = strtok(NULL, " \n");
    }

    printf("%lld", nrsecv(u) - nrsecv(l-1));

    return 0;
}