Cod sursa(job #9452)

Utilizator flo_demonBunau Florin flo_demon Data 27 ianuarie 2007 15:36:11
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Unirea 2007, clasele 11-12 Marime 2.02 kb
#include <stdio.h>
#include <list>
#include <map>
#include <iostream>
#include <algorithm>

#define MAX 1048600

using namespace std;

struct nod {
    int val;
    map<int, nod*> vec;
};

nod* rad;
nod* aux;
nod* curr;

int a[MAX], n, l, u;
map<int, int> caract;
int distincte;
long long rez;

void dfs(nod* node);

int main()
{
    //spawn tree
    rad = new nod;
    rad->val = 0;
    
    //read
    FILE *fin = fopen("secv5.in", "r");
    fscanf(fin, "%d%d%d", &n, &u, &l);
    if (u > l)
        swap(u, l);
    for (int i = 1; i <= n; ++i)
    {
        fscanf(fin, "%d", &a[i]);
        caract[a[i]] = 0;
    }
    fclose(fin);
    
    //build tree
    for (int i = 1; i <= n; ++i)
    {
        curr = rad;
        for (int j = i; j <= n; ++j)
        {
            if (curr->vec.count(a[j]) == 0)
            {
                aux = new nod;
                aux->val = a[j];
                curr->vec.insert(make_pair(a[j], aux));
                curr = aux;   
            }
            else
                curr = curr->vec[a[j]];   
        }
    }
    
    //solve
    map<int, nod*>::iterator start, end;
    start = rad->vec.begin();
    end = rad->vec.end();
    for (; start != end; ++start)
    {
        distincte = 0;
        dfs(((*start).second));
    }
    
    //write
    FILE *fout = fopen("secv5.out", "w");
    fprintf(fout, "%lld\n", rez);
    fclose(fout);
    
    return 0;
}

void dfs(nod* node)
{
    if (caract[(node->val)] == 0)
        distincte++;
    caract[(node->val)]++;
    if (distincte > l)
    {
        caract[(node->val)]--;
        if (caract[(node->val)] == 0)
            distincte--;
        return;
    }
    if (distincte >= u && distincte <= l)
        rez++;
    map<int, nod*>::iterator start, end;
    start = node->vec.begin();
    end = node->vec.end();
    for (; start != end; ++start)
        dfs(((*start).second));
    caract[(node->val)]--;
    if (caract[(node->val)] == 0)
        distincte--;
}