PKU 2121 Inglish-Number Translator

http://poj.org/problem?id=2121
アルファベット表記入力されたものを数字に直せというような問題。

百万、千、それ以下で区切って計算させてます。
最終行は空行だということを見落としてはまってました。

string num[]={"zero","one","two","three","four","five","six","seven","eight","nine","ten",
              "eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen",
              "twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety",
};
map<string,int> stoi;

ll get(vector<string>&in,string se){
  vector<string>::iterator p=find(ALL(in),se);
  if(p==in.end())return 0;
  int idx=distance(in.begin(),p)-1;
  int ret=0;
  while(idx>=0 && stoi.count(in[idx])){
    ret+=stoi[in[idx]];
    --idx;
  }
  if(idx>=0 && in[idx]=="hundred"){
    if(idx==0 || stoi[in[idx-1]]>9)for(;;);    
    ret+=100*stoi[in[idx-1]];
  }
  return ret;
}

main(){
  rep(i,28){
    stoi[num[i]]=i;
    if(i>20)stoi[num[i]]=(i-18)*10;
  }

  string in;
  while(getline(cin,in)){
    stringstream ss(in);
    vector<string> words;
    while(ss>>in)words.pb(in);
    if(words.empty())break;
    words.pb("small");
    ll ans=0;
    ans+=get(words,"million")*1000000;
    ans+=get(words,"thousand")*1000;
    ans+=get(words,"small");
    
    if(words[0]=="negative")ans*=-1;
    cout<<ans<<endl;
  }
}