int n, k, m, sz; int len[kMaxN], pos[kMaxK], hs1[kMaxK], pw[kMaxK]; bool vis[kMaxK]; std::pair<int, int> stk[kMaxK]; std::bitset<kMaxK> f[kMaxN]; std::string s[kMaxN], str; std::vector<int> hs2[kMaxN];
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; }
voidprework(){ for (int i = 1; i <= n; ++i) { hs2[i].resize(len[i] + 1); for (int j = 1; j <= len[i]; ++j) hs2[i][j] = add(13331ll * hs2[i][j - 1] % kMod, s[i][j]); } pw[0] = 1; for (int i = 1; i <= k; ++i) pw[i] = 13331ll * pw[i - 1] % kMod; }
u64 gethash(int p, int r, int pos, int o = 0){ if (!o || r <= pos) return hs1[r]; elsereturnadd(1ll * hs1[pos] * pw[r - pos] % kMod, hs2[p][r - pos]); }
boolcmp(int p, std::pair<int, int> p1, std::pair<int, int> p2){ // p1 <= p2 int len1 = p1.first + p1.second * len[p], len2 = p2.first + p2.second * len[p]; int L = 0, R = std::min(len1, len2) + 1, res = 0; while (L + 1 < R) { int mid = (L + R) >> 1; if (gethash(p, mid, p1.first, p1.second) == gethash(p, mid, p2.first, p2.second)) L = res = mid; else R = mid; } if (res == std::min(len1, len2)) return len1 <= len2; else { ++res; char c1, c2; if (res <= p1.first) c1 = str[res]; else c1 = s[p][res - p1.first]; if (res <= p2.first) c2 = str[res]; else c2 = s[p][res - p2.first]; return c1 <= c2; } }