Pagini recente » Cod sursa (job #115000) | Cod sursa (job #2923441) | Cod sursa (job #2598221) | Cod sursa (job #934243) | Cod sursa (job #9452)
Cod sursa(job #9452)
#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--;
}