Cod sursa(job #1583379)

Utilizator stoianmihailStoian Mihail stoianmihail Data 28 ianuarie 2016 22:11:19
Problema Secventa 5 Scor 90
Compilator c Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <stdio.h>

#define Nadejde 1048576

typedef struct {
  unsigned int v;
  int freq, next;
} cell;

int N, L, U;
int size, buff;
int hash[Nadejde];
cell map[Nadejde + 1];
unsigned int val[Nadejde];

/** Initializeaza tabela hash. **/
void init() {
  int i;

  for (i = size = buff = 0; i < Nadejde; i++) {
    hash[i] = 0;
  }
}

/** Cauta valoarea "x" in tabela hash. **/
int find(unsigned int x) {
  int pos;
  unsigned int 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(unsigned int x) {
  int pos = find(x);

  if ((pos != 0) && (map[pos].freq != 0)) {
    map[pos].freq++;
  } else {
    unsigned 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(unsigned 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, "%u", &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;
}