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; } }