# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
284783 | ChrisT | 세 명의 친구들 (BOI14_friends) | C++17 | 134 ms | 20984 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
const int MN = 2e6 + 5, MOD = 1e9 + 9, BASE = 143;
char s[MN]; int pw[MN], hsh[MN];
int substr (int l, int r) {
if (r < l) return 0;
int ret = hsh[r] - (long long)hsh[l-1] * pw[r-l+1] % MOD;
if (ret < 0) ret += MOD;
return ret;
}
int main () {
int n;
scanf ("%d",&n);
scanf ("%s",s+1);
if (!(n&1)) return !printf ("NOT POSSIBLE\n");
pw[0] = 1;
for (int i = 1; i <= n; i++) {
pw[i] = (long long)pw[i-1] * BASE % MOD;
hsh[i] = ((long long)hsh[i-1] * BASE + s[i] - 'A' + 1) % MOD;
}
int has = -1, where = -1;
for (int i = 1; i <= (n+1)/2; i++) {
int lhsh = ((long long)substr(1,i-1) * pw[n/2 - i + 1] + substr(i+1,n/2+1)) % MOD;
int rhsh = substr(n/2+2,n);
if (lhsh == rhsh) {
if (~has && has != lhsh) return !printf ("NOT UNIQUE\n");
has = lhsh; where = i;
}
}
for (int i = n/2+2; i <= n; i++) {
int lhsh = substr(1,n/2);
int rhsh = ((long long)substr((n+1)/2,i-1) * pw[n-i] + substr(i+1,n)) % MOD;
if (lhsh == rhsh) {
if (~has && has != lhsh) return !printf ("NOT UNIQUE\n");
has = lhsh; where = i;
}
}
if (where == -1) return !printf ("NOT POSSIBLE\n");
if (where > n/2) {
for (int i = 1; i <= n/2; i++) printf ("%c",s[i]);
printf ("\n");
} else {
for (int i = n/2+2; i <= n; i++) printf ("%c",s[i]);
printf ("\n");
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |