PKU 1055 BULK MAILING
http://poj.org/problem?id=1055
与えられたメールのzipコードというものを振り分ける。
基本的に数字の大きさ順で出力する。
10〜15の単位で小分けされる。
ということに注意する必要がある。
最初10個ごとに分けられるんだと思っていて、結構WAりました。
string in[1000]; bool va[1000]; int pos; main(){ string temp; int tl=0,tb=0; while(cin>>temp){ in[pos++]=temp; bool ok=true; rep(i,SZ(temp)){ if(!isdigit(temp[i])){ ok=false; break; } } if(ok && SZ(temp)==5 && temp!="00000")tl+=va[pos-1]=true; if(pos>1000)for(;;); } printf("ZIP LETTERS BUNDLES\n\n"); map<string,int> app; set<string> used; rep(i,pos){ if(va[i])app[in[i]]++; } FOR(miter,app){ if(miter->S>=10){ int bund=miter->S/15; if(miter->S%15)++bund; printf("%s %4d %3d\n",miter->F.c_str(),miter->S,bund); tb+=bund; used.insert(miter->F); } } puts(""); app.clear(); rep(i,pos){ if(va[i] && !used.count(in[i])){ app[in[i].substr(0,3)]++; } } FOR(miter,app){ if(miter->S>=10){ int bund=miter->S/15; if(miter->S%15)++bund; printf("%sxx %4d %3d\n",miter->F.c_str(),miter->S,bund); tb+=bund; used.insert(miter->F); } } puts(""); app.clear(); rep(i,pos){ if(va[i] && !used.count(in[i]) && !used.count(in[i].substr(0,3))){ app[in[i]]++; } } FOR(miter,app){ printf("%s %4d %3d\n",miter->F.c_str(),miter->S,miter->S/10); used.insert(miter->F); } puts(""); printf("TOTALS %3d %3d\n",tl,tb); puts(""); puts("INVALID ZIP CODES"); puts(""); rep(i,pos){ if(va[i] || used.count(in[i]))continue; cout<<in[i]<<endl; used.insert(in[i]); } }