Pagini recente » Cod sursa (job #358514) | Cod sursa (job #2701693) | Cod sursa (job #1031724) | Cod sursa (job #2457217) | Cod sursa (job #1583363)
#include <stdio.h>
#define Nadejde 1048576
typedef struct {
int v, freq, next;
} cell;
int N, L, U;
int size, buff;
int val[Nadejde];
int hash[Nadejde];
cell map[Nadejde + 1];
/** Initializeaza tabela hash. **/
void init() {
int i;
for (i = size = 0; i < Nadejde; i++) {
hash[i] = 0;
}
}
/** Cauta valoarea "x" in tabela hash. **/
int find(int x) {
int pos, h = x % Nadejde;
for (pos = hash[h]; (pos != 0) && (map[pos].v != x); pos = map[pos].next);
return pos;
}
/** Adauga valoarea "x" in tabela hash. **/
void insert(int x) {
int pos = find(x);
if (pos) {
map[pos].freq++;
} else {
int h = x % Nadejde;
size++;
map[++buff].v = x;
map[buff].freq = 1;
map[buff].next = hash[h];
hash[h] = buff;
}
}
/** Sterge o aparitie a valorii "x". **/
void erase(int x) {
int pos = find(x);
map[pos].freq--;
if (map[pos].freq == 0) {
size--;
}
}
/** Afla numarul subsecventelor care au sub "len" elemente distincte. **/
long long int low(int len) {
int i, j;
long long int count = 0;
for (i = j = 0; i < N; i++) {
insert(val[i]);
while (size > len) {
erase(val[j++]);
}
count += i - j + 1;
}
return count;
}
int main(void) {
int i;
FILE *f = fopen("secv5.in", "r");
/* Citirea datelor. */
fscanf(f, "%d %d %d", &N, &L, &U);
for (i = 0; i < N; i++) {
fscanf(f, "%d", &val[i]);
}
fclose(f);
/* Calcularea solutiei. */
long long int result = low(U);
init();
result -= low(L - 1);
/* Afisarea solutiei. */
freopen("secv5.out", "w", stdout);
fprintf(stdout, "%lld\n", result);
fclose(stdout);
/// Multumim Doamne!
puts("Doamne ajuta!");
return 0;
}