Untitled
unknown
plain_text
a year ago
3.3 kB
9
Indexable
#include <bits/stdc++.h> using namespace std; #define ll long long void FIO() { #ifndef ONLINE_JUDGE freopen("../in.txt", "r", stdin); freopen("../out.txt", "w", stdout); #else freopen("xmore.in", "r", stdin); #endif } ll power(ll x, ll p, ll mod) { ll ret = 1; while (p) { if (p & 1) { ret = (ret * x) % mod; } p >>= 1; x = (x * x) % mod; } return ret; } int MaxN = 1e6 + 7; struct stringHashing { vector<ll> pw1, pw2, invPw1, invPw2; int base1, base2, MOD1, MOD2; stringHashing() : pw1(MaxN), pw2(MaxN), invPw1(MaxN), invPw2(MaxN) { base1 = 131, base2 = 153, MOD1 = 1e9 + 7, MOD2 = 1e9 + 9; pw1[0] = pw2[0] = 1; for (int i = 1; i < pw1.size(); ++i) { pw1[i] = (pw1[i - 1] * base1) % MOD1; pw2[i] = (pw2[i - 1] * base2) % MOD2; } invPw1[MaxN - 1] = power(pw1[MaxN - 1], MOD1 - 2, MOD1); invPw2[MaxN - 1] = power(pw2[MaxN - 1], MOD2 - 2, MOD2); for (int i = MaxN - 2; i >= 0; --i) { invPw1[i] = (invPw1[i + 1] * base1) % MOD1; invPw2[i] = (invPw2[i + 1] * base2) % MOD2; } } vector<pair<ll, ll>> hash(string &s) { vector<pair<ll, ll>> hs(s.size() + 1, {0, 0}); for (int i = 0; i < s.size(); ++i) { hs[i + 1].first = (hs[i].first + (s[i] - '0' + 1) * pw1[i]) % MOD1; hs[i + 1].second = (hs[i].second + (s[i] - '0' + 1) * pw2[i]) % MOD2; } return hs; } pair<ll, ll> getRange(int l, int r, vector<pair<ll, ll>> &hs) { return { (hs[r + 1].first - hs[l].first + MOD1) * invPw1[l] % MOD1, (hs[r + 1].second - hs[l].second + MOD2) * invPw1[l] % MOD2 }; } } H; void solve() { int n; cin >> n; vector<string> v(n + 1); vector<vector<pair<ll, ll>>> hs(n + 1); for (int i = 1; i <= n; ++i) { string s; cin >> s; reverse(s.begin(), s.end()); while (s.size() > 1 && s.back() == '0') s.pop_back(); v[i] = s; hs[i] = H.hash(s); } int q; cin >> q; while (q--) { int x, y; cin >> x >> y; if (v[x].size() != v[y].size()) { cout << (max(v[x].size(), v[y].size())) << '\n'; } else { if (hs[x].back() == hs[y].back()) { cout << "-1\n"; continue; } int l = 1, r = v[x].size(), ans = 0; while (l <= r) { int mid = (l + r) / 2; if (H.getRange(v[x].size() - mid, v[x].size() - 1, hs[x]) == H.getRange(v[y].size() - mid, v[y].size() - 1, hs[y])) { ans = mid; l = mid + 1; } else { r = mid - 1; } } cout << (v[x].size() - ans - 1) << '\n'; } } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); FIO(); int t = 1; // cin >> t; while (t--) { solve(); } return 0; }
Editor is loading...
Leave a Comment