A. 3 idots
http://222.180.160.110:61234/contest/5556/problem/1
你会发现有两种情况:多余字符在前 / 后。
你拿后面的去匹配前面的,再拿前面的去匹配后面的,如果匹配出来有多解就 NOT UNIQUE
,无解就 NOT POSSIBLE
,有解就输出。
#include <bits/stdc++.h>
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
freopen("string.in", "r", stdin);
freopen("string.out", "w", stdout);
int n;
static char t[2000005];
std::cin >> n >> (t + 1);
if (n % 2 == 0)
std::cout << "NOT POSSIBLE\n";
else {
int p1, q1, p2, q2, i;
for (i = 0, p1 = n / 2; i < n / 2 && t[i + 1] == t[p1 + 1]; ++i, ++p1);
for (i = n / 2 + 1, q1 = n + 1; i > 1 && t[i - 1] == t[q1 - 1]; --i, --q1);
for (i = n / 2 + 1, p2 = 0; i < n && t[i + 1] == t[p2 + 1]; ++i, ++p2);
for (i = n + 1, q2 = n / 2 + 2; i > n / 2 + 2 && t[i - 1] == t[q2 - 1]; --i, --q2);
// printf("p1 = %d, q1 = %d; p2 = %d, q2 = %d\n", p1, q1, p2, q2);
if (p1 >= q1 - 2 && p2 >= q2 - 2 && [&]() -> bool {
for (int i = 1, j = n / 2 + 2; i <= n / 2; ++i, ++j) {
if (t[i] != t[j])
return 1;
}
return 0;
}())
std::cout << "NOT UNIQUE\n";
else if (p1 < q1 - 2 && p2 < q2 - 2)
std::cout << "NOT POSSIBLE\n";
else if (p1 >= q1 - 2) {
for (i = 1; i <= n / 2; ++i)
std::cout << t[i];
std::cout << '\n';
}
else {
for (int i = n / 2 + 2; i <= n; ++i)
std::cout << t[i];
std::cout << '\n';
}
}
return 0;
}