Give me the number数字単語回転数(シミュレーション)


Give me the number
Time Limit:1000MS  Memory Limit:65536K Total Submit:  Accepted:  
Description
英語では、数字は以下のように書かれています(現在は10^9未満の数字しか考えられません).数字abc,def,ghiは「[abc]million[def]thousand[ghi]」と記す.ここで「[xyz]」は3桁のxyzを表す.abc=0であれば「[abc]million」は省略され、def=0であれば「[def]thousand」も省略され、ghi=0であれば「[ghi]」も省略される.全体の数が0なら「ゼロ」と書きます.複数の「million」または複数の「thousand」があっても、単語「million」と「thousand」は単数形式であることに注意してください.千未満の数字は次のように表されます.数字xyzは「[x]hundred and[yz]」と表記します.(yz=0の場合、それは「[x]hundred」です.そうでない場合、y=0の場合、「[x]hundred and[z]」と表記します.)x=0の場合、「[x]hundred and」は省略されます.「hundred」も単数形式であることに気づく.20以下の数字は「zero」、「one」、「two」、「three」、「four」、「five」、「six」、「seven」、「eight」、「nine」、「ten」、「eleven」、「twelve」、「thirteen」、「fourteen」、「fifteen」、「sixteen」、「seventeen」、「eighteen」および「nineteen」と記す.20~99の間の数字は次の方法で表されます.数字xyは「[x 0][y]」と表記し、その中の「20」から「90」は「twenty」、「thirty」、「forty」、「fifty」、「sixty」、「seventy」、「eighty」、and「ninety」と表記する.例えば、数字987654312は「nine hundred and eighty seven million six hundred and fifty four thousand three hundred and twelve」数字10000037は「one hundred million thirty seven」、数字1000は「one thousand」と表記される.注意:百万、千、百に対して「one」は省略されません.英語で表される数字を与え、対応するアラビア数字の形式の整数を書いてください.
Input
複数のテスト例があります.入力された最初の行は整数T(1<=T<=1900)であり、試験例の個数を表す.次はT個のテスト例です.各テスト例は1行を占め、1つの数字を表す英語の単語の列です.
Output
各行に入力された英数字に対応し、対応するアラビア数字の整数を出力し、1行ずつ出力します.すべての整数が109未満であると仮定します.
Sample Input
4
one
eleven
one hundred and two
two hundred million seven hundred and one thousand two hundred and ten

Sample Output
1
11
102
200701210

コードと解題の構想は以下の通りである.
 
#include
#include
#include
using namespace std;
string str,temp;
map m;//強いmap
//char m[][20]={,m["one",m["two",m["three",m["four",m["five",m["six",m["seven",m["eight",m["nine",m["ten",m["eleven",m["twelve",m["thirteen",m["fourteen",m["fifteen",m["sixteen",m["seventeen",m["eighteen",m["nineteen","twenty",m["thirty",m["forty",m["fifty",m["sixty",m["seventy",m["eighty",m["ninety",m["hundred",m["thousand",m["",m["billion"};
int main()
{
//     freopen("E://data.in", "r", stdin);
       m["zero"]=0;
       m["one"]=1;
       m["two"]=2;
       m["three"]=3;
       m["four"]=4;
       m["five"]=5;
       m["six"]=6;
       m["seven"]=7;
       m["eight"]=8;
       m["nine"]=9;
       m["ten"]=10;
       m["eleven"]=11;
       m["twelve"]=12;
       m["thirteen"]=13;
       m["fourteen"]=14;
       m["fifteen"]=15;
       m["sixteen"]=16;
       m["seventeen"]=17;
       m["eighteen"]=18;
       m["nineteen"]=19;
       m["twenty"]=20;
       m["thirty"]=30;
       m["forty"]=40;
       m["fifty"]=50;
       m["sixty"]=60;
       m["seventy"]=70;
       m["eighty"]=80;
       m["ninety"]=90;
       m["hundred"]=100;
       m["thousand"]=1000;
       m["million"]=1000000;
       m["and"]=0;//うるさいですね.打ってからofficツールが使えることを思い出しました...Orz
       int cases;
       int num;
       int p;
       int i;
       int len;
       int sum;
       scanf("%d",&cases);
       getchar();
       while(cases--)
       {
              getline(cin,str);//stringはいくら使ってもあまり長くないようです==
              str=str+' ';//最初は単語ごとに処理したかったのですが、できないことに気づきました.sscanf()でしょうが、サボってしまいました
              str=' '+str;//「temp」という単語を見つけた
              num=0;
              p=1;
              sum=0;
              len=str.length();
              for(i=1;i              {
                     if(str[i]==' ')
                     {
                      temp=str.substr(p,i-p);//pからi-pの長さの列は、最初はbeginとendと表記されています.555覚えてstringsubstrの2番目のパラメータは長さです!!
                            p=i+1;
                            if(m[temp]>100)
                            {
                                   num*=m[temp];
                                   sum+=num;
                                   num=0;
                            }
else if(m[temp]==100)//100すごいB!!
                            {
                                   num*=100;
                            }
                            else
                                   num+=m[temp];
                     }
              }
              sum+=num;
              printf("%d/n",sum);
       }
       return 0;
}