PKU 3297 Open Source

http://poj.org/problem?id=3297
いくつかのプロジェクトに何人かの学生が参加している。
このうちプロジェクトごとにそのプロジェクトだけに参加している学生の数を出力しろというような問題。

mapとかを使ってやる。入力の形式が若干面倒くさい。

main(){
  string pr;
  while(getline(cin,pr),pr!="0"){
    map<string,set<string> >ptou;
    map<string,set<string> >utop;
    while(true){
      if(pr=="1")break;
      ptou[pr];
      string us;
      while(getline(cin,us)){
        if(!islower(us[0])){
          pr=us;
          break;
        }
        ptou[pr].insert(us);
        utop[us].insert(pr);
      }
    }
    map<int,set<string> >ans;
    FOR(iter,ptou){
      int num=0;
      FOR(sit,iter->S)if(utop[*sit].size()<2)++num;
      ans[-num].insert(iter->F);
    }
    FOR(iter,ans){
      FOR(sit,iter->S)cout<<*sit<<' '<<-iter->F<<endl;
    }
  }
}