This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 1<<21;
const unsigned long long B1 = 139, B2 = 137, MOD = (1e9) + 696969;
struct rolling_hash {
unsigned long long h1,h2;
void initialize() {
h1=0;
h2=0;
}
void append(char a) {
h1*=B1;h1+=a-'A'+1;h1%=MOD;
h2*=B2;h2+=a-'A'+1;h2%=MOD;
}
bool operator ==(const rolling_hash &a) const {
return h1==a.h1 && h2==a.h2;
}
bool operator <(const rolling_hash &a) const {
return ((h1==a.h1) ? h2<a.h2 : h1<a.h2);
}
};
int tests,current_case;
int n;
unsigned long long pw1[N],pw2[N];
rolling_hash ph[N];
int ans[N],sz;
rolling_hash h1,h2;
char a[N];
rolling_hash h;
int cnt;
set < rolling_hash > s;
void message(int current_case) {
//cerr<<"Case "<<current_case<<" solved!"<<endl;
fprintf(stderr, "Case %d solved!\n", current_case);
}
rolling_hash merge_hashes(rolling_hash a, rolling_hash b, int length) {
a.h1*=pw1[length];
a.h1+=b.h1;
a.h1%=MOD;
a.h2*=pw2[length];
a.h2+=b.h2;
a.h2%=MOD;
return a;
}
rolling_hash get_hash(int l, int r) {
rolling_hash hl=ph[l-1],hr=ph[r];
hl.h1*=pw1[r-l+1];
hl.h1%=MOD;
hl.h2*=pw2[r-l+1];
hl.h2%=MOD;
hr.h1-=hl.h1;
hr.h1+=MOD;
hr.h1%=MOD;
hr.h2-=hl.h2;
hr.h2+=MOD;
hr.h2%=MOD;
return hr;
}
int main() {
//ios_base::sync_with_stdio(false);
//cin.tie(NULL);
int i;
pw1[0]=1;
pw2[0]=1;
for(i=1;i<N;i++) pw1[i]=pw1[i-1]*B1%MOD,pw2[i]=pw2[i-1]*B2%MOD;
tests=1;
//scanf("%d", &tests);
//cin>>tests;
for(current_case=1;current_case<=tests;current_case++) {
s.clear();
scanf("%d", &n);
scanf("%s", a+1);
h.initialize();
ph[0]=h;
for(i=1;i<=n;i++) h.append(a[i]),ph[i]=h;
if(!(n&1)){
printf("NOT POSSIBLE\n");
goto MESSAGE;
}
sz=0;
for(i=1;i<=n;i++) {
if(i>n/2) h1=get_hash(1,n/2);
else h1=merge_hashes(get_hash(1,i-1),get_hash(i+1,n/2+1),n/2+1-(i+1)+1);
if(i<n-n/2+1) h2=get_hash(n-n/2+1,n);
else h2=merge_hashes(get_hash(n-n/2,i-1),get_hash(i+1,n),n-i);
if(h1==h2) ans[++sz]=i,s.insert(h1);
}
sz=(int)(s.size());
if(sz==0) {
printf("NOT POSSIBLE\n");
goto MESSAGE;
}
else if(sz>1) {
printf("NOT UNIQUE\n");
goto MESSAGE;
}
cnt=0;
for(i=1;cnt<n/2;i++) {
if(i==ans[1]) continue;
++cnt;
printf("%c", a[i]);
}
printf("\n");
MESSAGE:
message(current_case);
}
return 0;
}
Compilation message (stderr)
friends.cpp: In function 'int main()':
friends.cpp:82:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &n);
^
friends.cpp:83:25: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%s", a+1);
^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |