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++はこれぐらいで中断。