解けず。bitsetは未だに思い付けない。 bitsetの高速化はよく分からないのだけど、$k = 64$倍速いと思えばよいのかな。

solution

bitsetによる定数倍高速化。bit数$k$に対し$O(NQ/k)$。$k = 64$ [要出典]。

長さ$N$の大きなbitsetで、$A$と$B$を表すものをそれぞれ用意する。 これを$i$-bit shiftしたもののbit積のpopcountを$0 \le i \lt Q$に関して出力すればよい。

implementation

#include <iostream>
#include <bitset>
#define repeat(i,n) for (int i = 0; (i) < (n); ++(i))
using namespace std;
const int MAX_N = 100000;
int main() {
    int l, m, n; cin >> l >> m >> n;
    bitset<MAX_N> a; repeat (i,l) { int j; cin >> j; a[j-1] = true; }
    bitset<MAX_N> b; repeat (i,m) { int j; cin >> j; b[j-1] = true; }
    int q; cin >> q;
    repeat (i,q) cout << (a & (b << i)).count() << endl;
    return 0;
}