이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <fstream>
using ll = long long;
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) < (b)) ? (b) : (a))
int const modulo = 998244353;
int const nmax = 2000005;
int const sigma = 26;
int pow[1 + nmax];
int pref[1 + nmax];
void computepow(){
pow[0] = 1;
for(int i = 1;i <= nmax; i++)
pow[i] = 1LL * pow[i - 1] * sigma % modulo;
}
int extract(int x, int y){
int d = (y - x + 1);
return (modulo + pref[y] - 1LL * pref[x - 1] * pow[d] % modulo) % modulo;
}
int extract2(int x, int y, int skip){
int result1 = extract(x, skip - 1);
int result2 = extract(skip + 1, y);
int d = (y - skip);
return (1LL * result1 * pow[d] + result2) % modulo;
}
std::string s;
void extractprint(int x, int y, int skip){
for(int i = x; i <= y; i++)
if(i != skip) {
std::cout << (char)s[i];
}
}
int main()
{
computepow();
int n;
std::cin >> n;
if(n % 2 == 0){
std::cout << "NOT POSSIBLE\n";
return 0;
}
std::cin >> s;
s = "#" + s;
for(int i = 1; i <= n; i++)
pref[i] = (1LL * pref[i - 1] * sigma + s[i] - 'A') % modulo;
int id = -1, pos = 0;
for(int i = 1; i <= n; i++){
int result, result2;
if(i <= n / 2) {
result = extract2(1, n / 2 + 1, i);
result2 = extract2(n / 2 + 1, n, n / 2 + 1);
} else {
result = extract2(1, n / 2 + 1, n / 2 + 1);
result2 = extract2(n / 2 + 1, n, i);
}
if(result == result2){
if(id == -1) {
pos = i;
id = result;
} else if(id != result){
std::cout << "NOT UNIQUE\n";
return 0;
}
}
}
if(id == -1)
std::cout << "NOT POSSIBLE\n";
else {
if(pos <= n / 2)
extractprint(1, n / 2 + 1, pos);
else
extractprint(1, n / 2, n / 2 + 1);
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |