#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int b=101,c=103,M=2000010;
typedef unsigned long long ull;
ull sum1[M],sum2[M],power1[M],power2[M];
char s[M];
ull get_hush1(int x,int y){
return sum1[y]-sum1[x-1]*power1[y-x+1];
}
ull get_hush2(int x,int y){
return sum2[y]-sum2[x-1]*power2[y-x+1];
}
int main(){
int i,j,len,ans=0,ansl,ansr;
power1[0]=power2[0]=1;
for(i=1;i<M;i++){
power1[i]=power1[i-1]*b;
power2[i]=power2[i-1]*c;
}
scanf("%d\n%s",&len,s+1);
if(len%2==0){
puts("NOT POSSIBLE");
return 0;
}
sum1[0]=sum2[0]=0;
for(i=1;i<=len;i++){
sum1[i]=sum1[i-1]*b+(ull)(s[i]-'a');
sum2[i]=sum2[i-1]*c+(ull)(s[i]-'a');
}
for(i=1;i<=len/2;i++)
if(get_hush1(1,i-1)*power1[len/2-i+1]+get_hush1(i+1,len/2+1)==get_hush1(len/2+2,len))
if(get_hush2(1,i-1)*power2[len/2-i+1]+get_hush2(i+1,len/2+1)==get_hush2(len/2+2,len)){
if(ans==0){
ans++;
ansl=len/2+2;
ansr=len;
}
else if(get_hush1(len/2+2,len)!=get_hush1(ansl,ansr)||get_hush2(len/2+2,len)!=get_hush2(ansl,ansr))
ans++;
}
for(i=len/2+2;i<=len;i++)
if(get_hush1(len/2+1,i-1)*power1[len-i]+get_hush1(i+1,len)==get_hush1(1,len/2))
if(get_hush2(len/2+1,i-1)*power2[len-i]+get_hush2(i+1,len)==get_hush2(1,len/2)){
if(ans==0){
ans++;
ansl=1;
ansr=len/2;
}
else if(get_hush1(1,len/2)!=get_hush1(ansl,ansr)||get_hush2(1,len/2)!=get_hush2(ansl,ansr))
ans++;
}
if(get_hush1(1,len/2)==get_hush1(len/2+2,len))
if(get_hush2(1,len/2)==get_hush2(len/2+2,len)){
if(ans==0){
ans++;
ansl=1;
ansr=len/2;
}
else if(get_hush1(1,len/2)!=get_hush1(ansl,ansr)||get_hush2(1,len/2)!=get_hush2(ansl,ansr))
ans++;
}
if(ans==0){
puts("NOT POSSIBLE");
return 0;
}
if(ans>1){
puts("NOT UNIQUE");
return 0;
}
for(i=ansl;i<=ansr;i++)
printf("%c",s[i]);
puts("");
return 0;
}
BZOJ 3916
最新推荐文章于 2021-10-26 10:38:52 发布