structInfo { Z lr = 0; Z rl = 0; Z pw = 1; voidapply(const Info& o)& { *this = o; } }; Info operator + (const Info& l, const Info& r) { return { l.lr + r.lr * l.pw, r.rl + l.rl * r.pw, l.pw * r.pw }; }
constexprint P = 1e9 + 7; voidsolve(){ int N, Q; cin >> N >> Q;
SegmentTree<Info> seg(N);
vector<Z> h(N); for (int i = 0; i < N; i++) { h[i] = ull(rnd()); seg.apply(i, { h[i], h[i], H }); }
vector<vector<int>> dsu(N); for (int i = 0; i < N; i++) { dsu[i].push_back(i); }
auto uno = [&](int x, int y) { x = dsu[x][0]; y = dsu[y][0]; assert(x != y); if (dsu[x].size() < dsu[y].size()) swap(x, y); for (auto z : dsu[y]) { seg.apply(z, { h[x], h[x], H }); dsu[x].push_back(z); dsu[z] = { x }; } };
while (Q--) { int L1, R1, L2, R2; cin >> L1 >> R1 >> L2 >> R2; L1--; L2--;
while (L1 < R1) { for (int bit = 16; ~bit; bit--) { if (L1 + (1 << bit) <= N && L2 + (1 << bit) <= N && seg.query(L1, L1 + (1 << bit)).lr == seg.query(L2, L2 + (1 << bit)).lr) { L1 += (1 << bit); L2 += (1 << bit); } } if (L1 >= R1) break; uno(L1, L2); } }
int res = 1; for (int i = 0; i < N; i++) { if (dsu[i][0] == i) { if (res == 1) res = 9; else res = 1LL * res * 10 % P; } } cout << res << endl; }
int n, q, m, k; cin >> n >> q >> m >> k; vector<Hash> s(n); while (q--) { Hash t; int res = 0; for (int id = 0; id < n; ++id) { int kcnt = 0, i = 0; while (i < m) { // 比较第 i 位是否相同 if (t(i, i + 1) != s[id](i, i + 1)) { if (++kcnt > k) break; } int len = m - i; while (len) { if (t(i, i + len) != s[id](i, i + len)) len /= 2; elsebreak; } i += max(1, len); } res += kcnt <= k; } cout << res << endl; }