제출 #46210

#제출 시각아이디문제언어결과실행 시간메모리
46210arman_ferdous세 명의 친구들 (BOI14_friends)C++17
0 / 100
423 ms37892 KiB
#include <bits/stdc++.h>
using namespace std;

#define addmod(a,b,m) (a + b >= m ? a + b - m : a + b)

typedef long long ll;
const int N = 2000010;
int n;
string s;
ll h[N], p[N], base = 419, mod = 1234567891;

ll get(int l, int r) {
	l++, r++;
	if(r < l) return 0;
	return (h[r] - (p[r-l+1] * h[l-1] % mod) + mod) % mod;
}

int main() {
	cin >> n >> s;
	if(~n&1) { cout << "NOT POSSIBLE\n"; return 0; }
	int len = n/2;

	h[0] = 0, p[0] = 1;
	for(int i = 0; i < n; i++) {
		h[i+1] = (h[i]*base + s[i] - 'A' + 1) % mod;
		p[i+1] = p[i] * base % mod;
	}

	int idx = -1, cnt = 0;
	for(int i = 0; i < n; i++) {
		int l1 = (i == 0 ? 1 : 0);
		int r1 = (l1 < i && i <= l1 + len - 1 ? l1 + len : l1 + len - 1);
		ll h1 = get(l1,r1);

		int l2 = (r1 + 1 == i ? r1 + 2 : r1 + 1);
		int r2 = (i > l2 ? l2 + len : l2 + len - 1);
		ll h2 = get(l2,r2);

		if(l1 <= i && i <= r1) {
			int len = r1 - i;
			h1 = get(i+1,r1);
			ll part = get(l1,i-1) * p[len] % mod;
			h1 = addmod(h1,part,mod);
		}
		else if(l2 <= i && i <= r2) {
			int len = r2 - i;
			h2 = get(i+1,r2);
			ll part = get(l2,i-1) * p[len] % mod;
			h2 = addmod(h2,part,mod);
		}
		if(h1 == h2) cnt++, idx = i;
	}
	if(idx == -1) cout << "NOT POSSIBLE\n";
	else if(cnt > 1) cout << "NOT UNIQUE\n";
	else {
		string ans = "";
		int now = 0;
		for(int i = 0; i < n && now < len; i++) {
			if(i == idx) continue;
			ans += s[i];
			now++;
		}
		cout << ans << "\n";
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...