Codeforces #225(383 Div1) E. Vowels
問題
英小文字のうちa-xの24文字のどれか、3文字からなる単語がn個与えられる。
24文字のうち好きな文字を母音にしてよい。
母音が一文字以上含まれている単語はよい単語である。
2^24の母音の選び方に対して、(良い単語の数)^2を求め、それらを全てxorしたものを出力せよ。
制約条件
n≦10000
方針
こどふぉ史上最も酷いE?ゼータ変換するだけ。
ある単語のもつ文字の集合をbitで表す。
この単語をダメにする母音の選び方の集合は、~bitの部分集合。
なので、~bitの部分集合全てに1を足したい感じ。
これは部分集合に個数を伝播させるゼータ変換をすればいい。
そしたら、全てのbitについて、ダメな単語の個数がわかるので、nから引いて二乗すればよい。
ソースコード
int n, a[1 << 24]; int main(){ scanf("%d", &n); rep(i, n){ char buf[5]; scanf("%s", buf); int bit = (1 << 24) - 1; rep(j, 3) bit &= ~(1 << buf[j] - 'a'); a[bit]++; } rep (i, 24) rep(b, 1 << 24) if (!(b & 1 << i)) a[b] += a[b | (1 << i)]; ll ans = 0; rep(i, 1 << 24) ans ^= (ll)(n - a[i]) * (n - a[i]); cout << ans << endl; return 0; }