夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

516

早解き祭りに見せかけたchallenge祭りでした。。。

僕のお部屋が臆病とバカの塊だったので餌食にはされませんでしたが…

Easy NetworkXZeroOne

なんかoxを交互に並べていったんだけどところどころ腐食してわからなくなったから、全部可視化しろだって。
やるだけ。

class NetworkXZeroOne {
public:
  string reconstruct( string message ) {
    string result = "";
	bool flag;
	for (int i=0; i<message.length(); i++) {
		if ((message[i]=='o'&&i%2==0)||(message[i]=='x'&&i%2!=0)) {
			flag = true;
			break;
		} else if (message[i]=='o'||message[i]=='x') {
			flag = false;
			break;
		}
	}
	if (flag) {
		for (int i=0; i<message.length(); i++) {
			if (i%2==0) result += 'o';
			else result += 'x';
		}
	} else {
		for (int i=0; i<message.length(); i++) {
			if (i%2==0) result += 'x';
			else result += 'o';
		}
	}
    return result;
  }
};

Medium NetworkXOneTimePad

なんか暗号問題。。。
正しいキーの数を数えるらしいんだけど、英語ゲーでなんかキーは全ての暗号を生成できなきゃいけなかったらしく…

System Test Failedでした。
直してないコード

class NetworkXOneTimePad {
public:
  int crack( vector <string> plaintexts, vector <string> ciphertexts ) {
    set<string> keys;
	for (int i=0; i<plaintexts.size(); i++) {
		int len = plaintexts[i].length();
		for (int j=0; j<ciphertexts.size(); j++) {
			string key = "";
			for (int k=0; k<len; k++) {
				if (plaintexts[i][k] == ciphertexts[j][k]) key+='0';
				else key+='1';
			}
			keys.insert(key);
		}
	}
    return keys.size();
  }
};

Hard NetworkXMessageRecovery

見かけ簡単だけど実際ムズイ。

まぁとりあえず…TLEコードだけ書いときます。

// TLE
class NetworkXMessageRecovery {
public:
  string recover( vector <string> messages ) {
    string result = "";
	/* messagesが全て部分文字列となっている文字列
	 * 辞書順最小のものを探す
	 * 下手にソートを使うとexample2がだめ
	 * 辞書順に小さいものを取っていく
	 * ただしそれが他の文字列の後尾にあったらダメ
	 * */
	while (!messages.empty()) {
		sort(messages.begin(), messages.end());
		for (int i=0; i<messages.size(); i++) {
			char temp = messages[i][0];
			bool flag = true;
			for (int j=0; j<result.length(); j++) if (result[j] == temp) {
				flag = false;
				break;
			}
			if (flag) {
				messages[i].erase(1);
				continue;
			}
			for (int j=0; j<messages.size(); j++) {
				if (j == i) continue;
				for (int k=1; k<messages[j].length(); k++) {
					if (messages[j][k] == temp) {
						flag = false;
						break;
					}
				}
				if (!flag) break;
			}
			if (flag) {
				messages[i].erase(1);
				result += temp;
				break;
			}
		}
	}
    return result;
  }
};

結果

oxx +0 236.18pt 295位
852 -> 888(highest)
まぁとりあえず結果オーライ。
でも緑行きたかった…どうせなら