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