Tuesday, December 17, 2013

December 2013 Bronze Problem 1: Record Keeping

Result: 10/10 **********

As long as there aren't any hash collisions, this is a fast solution.

records.cpp

#include <iostream>
#include <fstream>

#include <map>
#include <string>
#include <locale>

#define loopi(x) loop_start(i,x,0)
#define loopj(x) loop_start(j,x,0)
#define loop_start(i, x,s) for(int i = (s); i < (x); ++i)
#define loop_rev(a,x,stop) for(int a = (x); a >= (stop); --a)

using namespace std;

locale l;
const collate<char>& coll = use_facet<std::collate<char> >(l);

int str_hash(string str){
 return coll.hash(str.data(), str.data() + str.length());
}

int main() {
 ofstream fout ("records.out");
 ifstream fin ("records.in");

 int N;
 fin >> N;

 int max_count = N ? 1 : 0;
 map<size_t, int> counts;

 loopi(N){
  string a, b, c;
  fin >> a >> b >> c;
  const int count = ++counts[str_hash(a) ^ str_hash(b) ^ str_hash(c)];
  if(count > max_count)
   max_count = count;
 }

 fout << max_count << endl;
 return 0;
}

No comments:

Post a Comment