Cod sursa(job #2003423)

Utilizator TincaMateiTinca Matei TincaMatei Data 22 iulie 2017 21:12:40
Problema Dtcsu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <ctype.h>

typedef long long i64;
const int NR_BAZE = 8;
const int MAX_BAZA = 500000;
const int MADJICK = 276997;
const int MADJICKHASH = 499979;
const int BUFF = 1 << 15;

char bloom[MAX_BAZA];
int base[NR_BAZE] = {499979, 499973, 499969, 499957, 499943, 499927, 499903, 499897};

char buftea[BUFF];
int curs = BUFF - 1;

static inline char getch(FILE *fin) {
  ++curs;
  if(curs == BUFF) {
    curs = 0;
    fread(buftea, 1, BUFF, fin);
  }
  return buftea[curs];
}

static inline i64 getnr(FILE *fin) {
  i64 nr = 0LL;
  char ch = getch(fin);
  while(!isdigit(ch))
    ch = getch(fin);
  while(isdigit(ch)) {
    nr = nr * 10 + ch - '0';
    ch = getch(fin);
  }
  return nr;
}

static inline void upd(i64 x) {
  for(int i = 0; i < NR_BAZE; ++i)
    bloom[x % base[i]] ^= (1 << i);
}

static inline int query(i64 x) {
  for(int i = 0; i < NR_BAZE; ++i)
    if(!(bloom[x % base[i]] & (1 << i)))
      return false;
  return true;
}

int main() {
  int s = 0, q;
  i64 x;
  FILE *fin = fopen("dtcsu.in", "r");
  for(int i = 0; i < MADJICK; ++i) {
    x = getnr(fin);
    if(x & 1)
      upd(x);
  }
  q = getnr(fin);
  for(int i = 0; i < q; ++i) {
    x = getnr(fin);
    if(x != 0)
      x /= (x & (-x));
    s += query(x);
  }
  fclose(fin);
  FILE *fout = fopen("dtcsu.out", "w");
  fprintf(fout, "%d", s);
  fclose(fout);
  return 0;
}