PKU2503 Babelfish
10万語ぐらいの辞書が与えられる。各クエリに対して、対応する中身があればその中身を返して、なければ"eh"と表示する。
なぜか人気のある問題。mapでも間に合うようにとの配慮からか、3000MSもある。
せっかくなのでSTLの練習。158B。
#import<map.h> #import<string> main(char*p,char*s){ for(map<std::string,std::string>D;gets(s); p?*p=0,D[p+1]=s,0:*s&&puts(*(p=&D[s][0])?p:"eh")) p=strchr(s,32); }
str.c_str()よりもstr.data()のほうが短い、さらには&str[0]のほうが…というのは勉強になった。いつでも使えるのかは謎。もっと賢い書き方があるのかもしれない。
辞書とクエリの間の空行のせいで4byte(*s&&)も食われてるので、空行を無視できるscanfを使ってみた。159B。
#import<map.h> #import<string> main(int r,char*s){ for(map<std::string,std::string>D;r=~scanf("%s%*[ ]%s",s,s+12);) r+2?D[s+12]=s,0:puts(D[s][0]?&D[s][0]:"eh"); }
どっちにしろCのほうが短くなるに違いないので、C++はこれぐらいで中断。