SRM 555 DIV2 本番

DIV2とかやだー

Coding

255

Brute Forceするだけ

555

遅い。瞬殺すべき
5^nは埋め込む。状態数そんな多くないしメモ化しないでもsubstrしても十分間に合う

955

うーん…色々考えたけど時間切れ

Challenge

適当に考えたケースとして、Easyでrow,colごとにgreedyとか?とかMediumで先頭に一致したらbreakしたらだめだよね、とか。
でもそんな複雑なミスする人はDIV2にはいなくて、結局Mediumで単純なミスを落としただけ。一人他の人に落とされてた。が、まあそんな落ちる人は居ない回なのかな
システムテスト後に見たら、それ以外に落ちてる人は居なかった。まあ良かったでしょう

結果

status pt
255 Passed 250.88
555 Passed 481.57
Challenge 1/0 +50

Division Place: 7/1016 (DIV2)
Rate: 11951357

コメント

Mediumでメモ化しない、というね。たぶん問題ないと思うけど、メモ化ということに全く頭が回らなかった。それはだめだ。
次から、絶対DIV2落ちとかやだなー

コード

255でPassしたコード

#include <string>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i))
#define rer(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i))
#define reu(i,l,u) for(int (i)=(int)(l);(i)<(int)(u);++(i))
#define aut(v, x) __typeof(x) v = (x)
#define each(it,o) for(aut(it, (o).begin()); it != (o).end(); ++ it)
#define all(o) (o).begin(), (o).end()
#define pb(x) push_back(x)
#define mp(x,y) make_pair((x),(y))
#define mset(m,v) memset(m,v,sizeof(m))
using namespace std;
typedef long long ll; typedef vector<int> vi; typedef pair<int,int> pii; typedef vector<pii> vpii;
const int INF = 0x3f3f3f3f; const ll INFL = 0x3f3f3f3f3f3f3f3fLL;

struct XorBoardDivTwo {
	int theMax(vector <string> b) {
		int h = b.size(), w = b[0].size();
		int r = -INF;
		rep(i, h) rep(j, w) {
			vector<vector<int> > t(h);
			rep(y, h) rep(x, w) t[y].pb(b[y][x]=='1');
			rep(k, w) t[i][k] ^= 1;
			rep(k, h) t[k][j] ^= 1;
			int e = 0;
			rep(y, h) rep(x, w) {
				e += t[y][x];
			}
			r = max(r, e);
		}
		return r;
	}
};

555でPassしたコード(テンプレは255のものと同じなので略)

string d[22]={
"1","101","11001","1111101","1001110001","110000110101","11110100001001",
"10011000100101101","1011111010111100001","111011100110101100101",
"100101010000001011111001","10111010010000111011011101",
"1110100011010100101001010001","1001000110000100111001110010101",
"101101011110011000100000111101001","11100011010111111010100100110001101",
"10001110000110111100100110111111000001","1011000110100010101111000010111011000101",
"110111100000101101101011001110100111011001","100010101100011100100011000001001000100111101",
"10101101011110001110101111000101101011000110001","1101100011010111001001101011011100010111011110101"
};
set<string>e;
struct CuttingBitString {
	int rec(string s) {
		if(s.size()==0)return 0;
		int r = INF;
		rer(i, 1, s.size()) {
			if(e.count(s.substr(0,i))) {
				r = min(r, 1 + rec(s.substr(i,s.size()-i)));
			}
		}
		return r;
	}
	int getmin(string S) {
		rep(i,22)e.insert(d[i]);
		int r = rec(S);
		return r == INF ? -1 : r;
	}
};