int n, base = 114514; int bs[20], hs[20][kMaxN], f[20][kMaxN]; std::string str;
intqpow(int bs, int64_t idx = kMod - 2){ int ret = 1; for (; idx; idx >>= 1, bs = (int64_t)bs * bs % kMod) if (idx & 1) ret = (int64_t)ret * bs % kMod; return ret; }
inlineintadd(int x, int y){ return (x + y >= kMod ? x + y - kMod : x + y); } inlineintsub(int x, int y){ return (x >= y ? x - y : x - y + kMod); } inlinevoidinc(int &x, int y){ (x += y) >= kMod ? x -= kMod : x; } inlinevoiddec(int &x, int y){ (x -= y) < 0 ? x += kMod : x; }
voidinit(int n, constchar s[]){ ::n = n; str.resize(n + 1); for (int i = 1; i <= n; ++i) str[i] = s[i - 1]; for (int i = 0; i <= 19; ++i) { bs[i] = qpow(base, 1 << (30 - i)); for (int j = 1, pw = bs[i]; j <= n; ++j, pw = 1ll * pw * bs[i] % kMod) hs[i][j] = add(hs[i][j - 1], 1ll * pw * (int)str[j] % kMod); } for (int i = 1; i <= n; ++i) f[0][i] = str[i]; for (int i = 1; i <= std::__lg(n); ++i) for (int j = 1; j <= n - (1 << i) + 1; ++j) f[i][j] = add(f[i - 1][j], 1ll * bs[i] * f[i - 1][j + (1 << (i - 1))] % kMod); }
intquery(int i, int k){ ++i; if (k > std::__lg(n - i + 1)) return0; return1ll * sub(hs[k][i + (1 << k) - 1], hs[k][i - 1]) * qpow(qpow(bs[k]), i) % kMod == f[k][i]; }