Submission #1224155

#TimeUsernameProblemLanguageResultExecution timeMemory
1224155omsincoconutOlympiads (BOI19_olympiads)C++17
0 / 100
0 ms324 KiB
#include <iostream> #include <string.h> #include <algorithm> #include <unordered_map> using namespace std; typedef long long ll; const int MAXN = 3e3+5; const ll MOD = 1e9+7, BASE = 97, INV = 268041239; ll pw[MAXN], invpw[MAXN]; void init() { pw[0] = invpw[0] = 1; for (int i = 1; i < MAXN; i++) { pw[i] = (pw[i-1]*BASE)%MOD; invpw[i] = (invpw[i-1]*INV)%MOD; } } pair<int, int> check(string &s, string &t, int k) { int n = s.size()-2, m = t.size()-2; ll sq[n+1], tq[m+1]; sq[0] = tq[0] = 0; for (int i = 1; i <= n; i++) { sq[i] = (sq[i-1] + pw[i]*(s[i]-'a'))%MOD; } for (int i = 1; i <= m; i++) { tq[i] = (tq[i-1] + pw[i]*(t[i]-'a'))%MOD; } unordered_map<ll, int> dt; for (int i = 0; i+k <= n; i++) { ll val = (sq[i+k]-sq[i]+MOD)%MOD*invpw[i+1]%MOD; dt[val] = i; } for (int i = 0; i+k <= m; i++) { ll val = (tq[i+k]-tq[i]+MOD)%MOD*invpw[i+1]%MOD; for (int j = 1; j <= k; j++) { if (dt.count(val)) return {dt[val], i}; val = (val-(t[i+j]-'a')+MOD)%MOD; val = (val*invpw[1])%MOD; val = (val+pw[k-1]*(t[i+j]-'a'))%MOD; } } return {-1, -1}; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); init(); string s, t; cin >> s >> t; s = '.'+s+'.'; t = '.'+t+'.'; int l = 0, r = min(s.size()-1, t.size()-1); pair<int, int> ans[min(s.size(), t.size())]; while (r-l > 1) { int mid = (l+r)>>1; pair<int, int> check1 = check(s, t, mid); reverse(t.begin(), t.end()); pair<int, int> check2 = check(s, t, mid); reverse(t.begin(), t.end()); if (check1 != make_pair(-1, -1)) { l = mid; ans[l] = check1; } else if (check2 != make_pair(-1, -1)) { l = mid; ans[l] = make_pair(check2.first, t.size()-check2.second-l-2); } else r = mid; } cout << l << '\n' << ans[l].first << ' ' << ans[l].second; return 0; } /* zxyabcd yxbadctz */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...