今日の練習 SRM397Div2

250点問題を25分で解いて、182点を獲得。システムテストも通った。
文字列を扱うのはあまりなれていないので調べながら。軽く調べたけど整数を文字列にしたり文字列を整数にしたりする方法がわからなかったのでそれは自分でやった。さすがに探せばそれくらいはあるだろうと思うのだけど。

  string decodingEncoding(string code, string message) {
    char c = message[0];
    size_t N = message.size();
    string result = "";

    if('0' <= c && c <= '9'){
      for(size_t i=0; i<N; i+=2){
        string s = message.substr(i, 2);
	size_t x = (s[0] - '0') * 10 + (s[1] - '0');
	result.push_back(code[x - 1]);
      }

    }else{
      for(size_t i=0; i<N; i++){
        char c = message[i];
	size_t pos = code.find(c) + 1;
	result.push_back('0' + pos / 10);
	result.push_back('0' + pos % 10);
      }
    }
    return result;
  }

そして500点問題を開いたけど解けない…まじめに幅優先探索とかする必要があるのか。

        • -

2文字の数字からなる文字列を整数に変換するのに関しては、istringstreamを使って簡単にできた。しかし整数を文字列に変える側は「1桁の時は頭に0がついて欲しい」というのが面倒。boost/formatを使えばいいらしいんだけど、手元の環境にboostが入ってなくて、port installしたらエラーで止まってしまったorz

        • -

Macにportでboostをインストールする - 佐藤伸吾(akio0911)のデジタルライフスタイルハック
http://d.hatena.ne.jp/akio0911/20080320/1206015831

お!

        • -

できた!

  string decodingEncoding(string code, string message) {
    char c = message[0];
    size_t N = message.size();
    ostringstream oss;
    string result = "";

    if('0' <= c && c <= '9'){
      for(size_t i=0; i<N; i+=2){
        string s = message.substr(i, 2);
	istringstream iss(s);
	size_t x;
	iss >> x;
	oss << code[x - 1];
      }

    }else{
      for(size_t i=0; i<N; i++){
        char c = message[i];
	size_t pos = code.find(c) + 1;
	oss << boost::format("%1$02d") % pos;
      }
    }
    return oss.str();
  }
        • -

IRCでlexical_castを教えてもらった

      for(size_t i=0; i<N; i+=2){
        string s = message.substr(i, 2);
	size_t x = boost::lexical_cast<size_t>(s);
	oss << code[x - 1];
      }

おお、これはよさそう。内部ではstringstreamを使って変換しているらしい。

        • -
      BOOST_FOREACH(char& c, message){
	size_t pos = code.find(c) + 1;
	oss << boost::format("%1$02d") % pos;
      }

boostすごーー!