SRM317 div2
//ふつうに、0~100000000でループしてたらおそらく間に合わない. //なので、123 4 321みたいになるはずだから、 //m = ss.str(); reverse(m.begin(), m.end() ); と仕込みしておいて、 // string tmp = (i != 10) ? (ss.str() + c + m) : (ss.str() + m);みたいにすればよろしいかと. //setLLにしているのは、99999 5 99999 //つまり、11桁にしてる(めんどくさいから)ため。 class PalindromicNumbers { public: int countPalNums(int lower, int upper) { set<LL> validNum; for(int i = 1; i <= 9; i++) { validNum.insert(i); } for(int i = 1; i < 100000; i++) { stringstream ss; ss << i; string m = ss.str(); reverse(m.begin(), m.end() ); for(int i = 0; i <= 10; i++) { char c = i + '0'; string tmp = (i != 10) ? (ss.str() + c + m) : (ss.str() + m); int num; sscanf(tmp.c_str(), "%d", &num); validNum.insert(num); } } set<LL>::iterator beg, end; beg = validNum.lower_bound(lower); end = validNum.lower_bound(upper); int flag = (*end == upper) ? 1 : 0; //そして、単純に,beg-endはできず、こういうかたちに。境界条件についてはNo Problemだとおもう。 //beg - validNum.begin() とかもできない。 return vector<LL>(beg, end).size() + flag; }
//最後のとこはこうかくとcool return (int)distance(validNum.lower_bound(lower), validNum.upper_bound(upper) );
difficult
良く分からんかったので、他人の解答見たらビット演算してた。 000 001 011 111 101 111 010 110 111 011 111 100 110 111 101 111 よーく見るとビットで順番を表しているのが分かる。そうか、おなじみの全探索だ! 詳しく見てみる。 {"NNNN", "YNNY", "NNNN", "YNNN" 0001のとき,最初に0番目の要素が配置された状態。 i = 0 //(i&(1<1としたいけど、req[1][0] = 'Y'なので、無理ですよ、ということ。 以下同様。
//一番分かりやすかったのを改変した。 long long countOrderings(vector <string> req) { int sz = req.size(); map<int, LL> work; work[0] = 1; for(int i = 0; i < (1<<sz); i++) { for(int j = 0; j < sz; j++) { if( (i&(1<<j)) == 0) { bool flag = true; for(int k = 0; k < sz; k++) { if((i&(1<<k)) && req[j][k] == 'Y') { flag = false; break; } } if(flag) work[i|(1<<j)] += work[i]; } } } return work[(1<<sz)-1]; }