PKU 3654 Electronic Document Security

http://poj.org/problem?id=3654
エンティティにライトを付け足したり、置き換えたり、消したりして、指定した形式で出力しろというような問題。

実装ゲー。mapとかsetとかを使いまくりで楽にやらせてもらいました。

main(){
  string in;
  int ca=0;
  while(cin>>in,in!="#"){
    rep(i,SZ(in))
      if(in[i]==',')in[i]=' ';
    stringstream ss(in);
    map<char,set<char> >ans;
    while(ss>>in){
      rep(i,SZ(in)){
        if(!isalpha(in[i])){
          if(in[i]=='='){
            set<char>tt;
            for(int j=i+1;j<SZ(in);++j)tt.insert(in[j]);
            rep(j,i)
              ans[in[j]]=tt;

          }else if(in[i]=='+'){
            rep(j,i)
              for(int k=i+1;k<SZ(in);++k)ans[in[j]].insert(in[k]);

          }else{
            rep(j,i){
              for(int k=i+1;k<SZ(in);++k)ans[in[j]].erase(in[k]);
              if(ans[in[j]].empty())ans.erase(in[j]);
            }
          }
          break;
        }
      }
    }
    cout<<++ca<<':';
    set<char>bef;
    if(!ans.empty())bef=ans.begin()->S;
    FOR(iter,ans){
      if(iter->S!=bef){
        FOR(siter,bef)cout<<*siter;          
      }
      cout<<iter->F;        
      bef=iter->S;
      if(ans.rbegin()->F==iter->F)FOR(siter,bef)cout<<*siter;      
    }
    cout<<endl;
  }
}