이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;
const int N = 2'000'010;
char s[N];
int n;
int fenN[N], fenN1[N];
template<int fen[]>
void add(int i)
{
++i;
while (i < N) {
fen[i]++;
i += i & -i;
}
}
template<int fen[]>
int get(int r)
{
int ans = 0;
while (r > 0) {
ans += fen[r];
r -= r & -r;
}
return ans;
}
template<int fen[]>
int get(int l, int r)
{
return get<fen>(r) - get<fen>(l);
}
bool test(int i)
{
if (i <= n)
return get<fenN1>(0, i) + get<fenN>(i+1, n+1) == n;
else
return get<fenN>(0, i-n) + get<fenN1>(i-n, n) == n;
}
int main()
{
cin.tie(0) -> sync_with_stdio(false);
cin >> n >> s;
if (n%2 == 0) {
cout << "NOT POSSIBLE\n";
return 0;
}
n = (n-1)/2;
Loop (i,0,n+1)
if (s[i] == s[i+n])
add<fenN>(i);
Loop (i,0,n)
if (s[i] == s[i+n+1])
add<fenN1>(i);
vector<int> pos;
Loop (i,0,2*n+1) {
if (i && s[i-1] == s[i])
continue;
if (test(i))
pos.push_back(i);
}
if (pos.empty())
cout << "NOT POSSIBLE\n";
else if (pos.size() > 1)
cout << "NOT UNIQUE\n";
else if (pos[0] <= n)
cout << s + n+1 << '\n';
else {
s[n] = 0;
cout << s << '\n';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |