제출 #222703

#제출 시각아이디문제언어결과실행 시간메모리
222703Bruteforceman세 명의 친구들 (BOI14_friends)C++11
35 / 100
1050 ms41444 KiB
#include <bits/stdc++.h> using namespace std; string s; const int mod = 100000000 + 7; const int base = 131; long long modpow(int b, int e) { if(e == 0) return 1; if(e & 1) return (modpow(b, e - 1) * b) % mod; long long m = modpow(b, e >> 1); return (m * m) % mod; } int main() { int n; cin >> n >> s; n = s.size(); int sz = (n - 1) / 2; auto func = [&] (int i, int j) { long long pw = 1; long long ans = 0; for(int x = i; x <= j; x++) { ans += pw * s[x]; pw = (pw * base) % mod; ans %= mod; } return ans; }; auto twice = [&] (int x) { return (x * (modpow(base, sz) + 1)) % mod; }; int p = func(0, sz - 1); int q = func(sz + 1, n - 1); p = twice(p); q = twice(q); vector <long long> pre (n), suf (n); long long var = 0; for(int i = 0; i < n; i++) { pre[i] = var; var += modpow(base, i) * s[i]; var %= mod; } var = 0; for(int i = n - 1; i >= 0; i--) { suf[i] = var; if(i == 0) break; var += modpow(base, i - 1) * s[i]; var %= mod; } set <int> can; int idx = -1; for(int i = 0; i < n; i++) { long long h = (pre[i] + suf[i]) % mod; if(h == p || h == q) { idx = i; can.insert(h); } } if(can.empty()) { cout << "NOT POSSIBLE" << endl; } else if (can.size() > 1) { cout << "NOT UNIQUE" << endl; } else { string aux; for(int i = 0; i < n; i++) { if(idx != i) aux += s[i]; } cout << aux.substr(0, sz) << endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...