Cod sursa(job #1038705)

Utilizator razvan9310FMI - Razvan Damachi razvan9310 Data 21 noiembrie 2013 21:44:27
Problema Dtcsu Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <unordered_set>
using namespace std;

unordered_set<unsigned long long> hashtable;

int binSearch(const unsigned long long &val) {
  int left = 1, right = 32;
  int best = 0;
  while (left <= right) {
    int mid = (left + right) / 2;
    unsigned long long div = 1LL << mid;
    if (val % div == 0) {
      best = mid;
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }
  return best;
}

int main() {
  ifstream in("dtcsu.in");
  string buffer;
  unsigned long long number = 0;

  for (int i = 0; i < 276997; ++i) {
    number = 0;
    getline(in, buffer);
    int j, size = buffer.size();
    for (j = 0; j < size; ++j) {
      number = number * 10 + buffer[j] - '0';
    }
    if (number & 1) {
      hashtable.insert(number);
    }
  }

  int Q, count = 0;
  unordered_set<unsigned long long>::iterator not_found = hashtable.end();
  in >> Q;
  getline(in, buffer);

  for (int i = 0; i < Q; ++i) {
    number = 0;
    getline(in, buffer);
    int j, size = buffer.size();
    for (j = 0; j < size; ++j) {
      number = number * 10 + buffer[j] - '0';
    }

    int iterator = 0;
    if (number & 1) {
      count += hashtable.find(number) != not_found;
    } else {
      number >>= binSearch(number);
      count += hashtable.find(number) != not_found;
    }
  }

  in.close();
  ofstream out("dtcsu.out");
  out << count;
  out.close();
  return 0;
}