ミス

約1時間30分間気付かなかったミス

数を長さNで循環シフトさせて、その後の偶奇を知りたかった。 if((x - shift + N) % N % 2 == 0) ... としなければいけないところを if((x - shift) % 2 == 0) ... とかしていた。 当たり前だが、((x mod m) mod n = x mod n)は一般には成り立たない。 例え…

約40分気付かなかったミス

rep(j, a.size()) aa[a[j]] = 1; とすべきところを rep(j, a.size()) aa[j] = 1; としていた。 解法がMaximumFlowであって、そっちがバグってるんじゃないかと思っていたが単純なミスだった。解法・ライブラリ・変な所が間違ってるんじゃないかと思って確認…

ptrdiffの左右

(p - str)とかしてインデックスを求めることはそれなりにある。 しかしこれ(p - str)を(str - p)としても何の警告も出ない!(もしかしたらstrが配列の時は何かあるかも?) (node - nodes)とか紛らわしい名前を使っていると、(nodes - node)としてしまっても…

multisetの値でのeraseはその値が全部消える

int a[5]={1,2,2,2,4}; multiset<int> s(a,a+5); s.erase(2); //s = {1,4} C++STLはきちんと体系的に学んでいないから勘違いが多くて悪い</int>

map a; a[x] = a.count(x) ? y : z;

map<string,int> a; for(int i = 0; i < name.size(); i ++) { string s = name[i]; a[s] = a.count(s) ? max(a[s], score[i]) : score[i]; } 名前のリストと(負の数もありうる)スコアのリストが与えられるので名前ごとの最大スコアを計算するという趣旨のコード。 しか</string,int>…

入力パースは可変長なところに注意!

"SRM 303 DIV1 Medium Knights"で、本問題は出来たのに入力パースミスった! この問題は"D1 D5 E2 E4 C3"のような、アルファベットと数字のリストで与えられる。 そこを、stringstreamで両方charで読んでしまった! "D10 E22"のような二文字に渡る数値によっ…

オーバーフローミス多すぎ

もう、速度の問題とかオーバーロードの問題とか無い時は、基本的にはlong longを使うようにする。 そのためにテンプレートのtypedefを変えてみた。 ついでにvectorもいれてみた 旧 typedef long long ll; typedef vector<int> vi; typedef pair<int,int> pii; typedef vect</int,int></int>…

__builtin_popcountll

__builtin_popcount関数は便利。だが、これはunsigned int用であって、(sizeof int < sizeof (long long) だと)long longだと暗黙に切り詰められちゃう。 unsigned long long用には__builtin_popcountllがある。 これにWarning出すにはどうしたらいいんだろ…

ASCIIの勘違い

なんか0x7Fを今まで'`'だと勘違いしてた。今までよく無事だったな…。 本当の0x7Fは'~'。bitwise-not演算子。チルダ。 0x7F: '~' string(1,'~') "~~~~~~~~~~~~~~~~~~~~~~~~~"

変数のshadowing

頻繁にやってしまう。警告も何も出ない。 そして意味不明なバグとなって混乱させる。 また、今回はたまたまExample通ったからFailedした。 g++に-Wshadowというオプションがあるようだ。これと-Werrorつけてやるか

doubleなのにintにいれちゃう

vpii v; //... v.pb(mp(hypot(xi - xj, yi - yj), j)); 的なことをやってしまった。 double直接でなく、pairのvectorというのがわかりにくくしていたか。 警告は出てたが無視してしまった。 警告は無視するな!

wordsとして文字列を連結する時

間にスペースや"$"などを入れること

2は偶素数

偶数の素数が1つあって、それは2。 いろいろな定理で"奇素数"とか"n以上"とかで回避されてることがある。 場合分けするように注意

メモ化を忘れる

酷いミス。確認しろ 本当に

(1 << (long long)i) は駄目

シフト演算子の結果は、左右辺の大きい方の型、ではなく、必ず左辺の型になる(たぶん)。 ので、iをlong longにしないで、必ず (1LL チャレンジの際にも気に留めておこう