カメヲラボ

主にプログラミングとお勉強全般について書いてます

All in All

  • 変態的な97B

http://acm.pku.edu.cn/JudgeOnline/problem?id=1936
スペースで区切られた2つの文字列について、左側の文字列が右側に含まれるかを調べる問題。たとえば、

ABC qAwBeCr

という入力であれば、離れてはいるが右側の文字列にABCが含まれているので"Yes"と出力しなければならない。
最初はgets()でまとめて読み込んでから比較していたのだが、あまり短くならなかったので、scanfで2つに分けて読み込む。ある程度短くなれば、あとはRuntimeErrorとの戦いだ。char型の配列だと一文字1バイトなのでどうしても大きくなってしまうから、int型の配列を使いたい。それから、ここが一番重要なポイントだが、同じ文字列があるかを調べる問題なのだから、左側の文字列より右側の文字列の方がずっと長いだろうと読むことが重要だ。合わせて100000字以内という記述から、安易に50000字ずつくらいだろなぁという判断はよろしくない。同じくらいの文字数なら、strcmpの比較くらいしか出来ないからだ。というわけで、私は左側の文字列がせいぜい1000文字以内だろうと見積もってやっていたのだが、実際は50文字も無いようだ。

以上のことを総合すると、このようなコードが出来る。

char*p,*q;
s['~~'];
main(){
  for(;~scanf("%s%s",p=s,q=s+9);puts(*p?"No":"Yes"))
    for(;*q;)p+=*p==*q++;
}

s+9で通ったということは・・・w

ちなみに変態的ではあるがまだちゃんとしているというコードは
http://d.hatena.ne.jp/kurimura/20060623/1151069622
ここで公開されている。kurimuraさんとは変数名が全く一緒だ^^;
getchar()で一文字ずつ読み込むのはムズそうだからパス!と私は思っていたが、hinoeさんはこの方法で100バイトまで短縮している。短縮の難度からすると、こっちの方が上だろう。

以上、トップ3の変態コード集でしたw