#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.
miércoles, 28 de septiembre de 2011
11239 - Open Source - UVA
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario