miércoles, 28 de septiembre de 2011

11239 - Open Source - UVA

#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#include<set>
#define db(a) cout << #a << " = " << a << endl;
#define db2(a, b) cout << #a << " = " << a << " = " << #b << " = " << b << endl;
#define foreach(it, l) for (typeof(l.begin()) it = l.begin(); it != l.end(); it++)
using namespace std;
struct proyecto {
 string nombre;
 int cantidad;
 proyecto(string nombre1 = "", int cantidad1 = 0) : nombre(nombre1), cantidad(cantidad1) {}
};
bool cmp(proyecto a, proyecto b) {
 if(a.cantidad > b.cantidad) return true;
 if(a.cantidad < b.cantidad) return false;
 if(a.nombre < b.nombre) return true;
 return false;
}
int main() {
 string line;
 map<string, set<string> > mapa;
 set<string> s;
 vector<proyecto> res;
 string capital;
 while(getline(cin, line)) {
  if(line == "0") break;
  if(line[0] == '1') {
   foreach(it_set, s) {
   int cont = 0;
   foreach(it, mapa)
    if(it->second.count(*it_set)) cont++;
   
   if(cont > 1) 
    foreach(it, mapa) 
     if(it->second.count(*it_set)) it->second.erase(it->second.find(*it_set));
   }
   foreach(it, mapa) {
    res.push_back(proyecto(it->first, it->second.size()));
   }
   sort(res.begin(), res.end(), cmp);
   foreach(it, res) {
    printf("%s %d\n", it->nombre.c_str(), it->cantidad);
   }
   res.clear();
   mapa.clear();
   s.clear();
   continue;
  }
  if(line[0] < 'A' || line[0] > 'Z') {
   mapa[capital].insert(line);
   s.insert(line);
  }
  else mapa[line], capital = line;
 }
 return 0;
}


use STL map and set for a best perfomance of the problem.

No hay comentarios:

Publicar un comentario