AOJ_2273 Shiritori

問題
解法
対話型プログラムを書く変わった問題。おもしろい。

AIの単語をsetを使って記録しておく。
自分の言う言葉の生成方法はいろいろあるが、bitで管理することにした。
具体的には以下

変数iを用意して0で初期化する。
(1) i++;
(2) 単語生成
 1文字め…AIの最後の文字
 2文字め…iの下1Bit目が, 1なら 'p', 0なら'o'
 3文字め…iの下2Bit目が, 1なら 'p', 0なら'o'
      ...
 n(<=9)文字め…iの下(n-1)Bit目が, 1なら 'p', 0なら'o'
 10文字め…'n'

ぽぽぽぽーーんってなるのをねらっていたけど、
50回までで決着がついてしまう…orz

#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <set>
using namespace std;

typedef set<string> S;
int main(){
	char ai[3];
	char pr[11] = "poooooooon";
	int i = 0;
	S siritori;
	siritori.insert(string(pr));
	while(true){
		printf("?%s\n", pr); fflush(stdout);
		scanf("%s", ai);
		S::iterator it = siritori.find(string(ai));
		if(ai[0] != 'n' || it != siritori.end()
			|| !(ai[1] == 0 || ('a' <= ai[1] && ai[1] <= 'z'))){
			//勝ちました
			printf("!OUT\n");
			return 0;
		}
		siritori.insert(string(ai));

		char c;
		++i;
		if(ai[1] == 0) c = ai[0];
		else c = ai[1];
		pr[0] = c;
		for(int k = 1; k <= 8; k++){
			if((i >> (k-1)) & 1 == 1)
				pr[k] = 'p';
			else
				pr[k] = 'o';
		}
	}
	return 0;
}