#include<bits/stdc++.h>
#define int long long
const int MAXN=2e6+10;
const int Base=131;
const int MOD=2147364847;
int n;
char s[MAXN];
int hash[MAXN],mypow[MAXN];
int flag,p;
void init(char *s,int len)
{
int i,j;
hash[0]=0;
mypow[0]=1;
for(i=1;i<=len;i++)
{
hash[i]=hash[i-1]*Base+(int)(s[i]);
hash[i]%=MOD;
mypow[i]=mypow[i-1]*Base;
mypow[i]%=MOD;
}
}
int gethash(int l,int r)
{
return (hash[r]-hash[l-1]*mypow[Base,r-l+1]%MOD+MOD)%MOD;
}
int check(char *s,int len,int k)
{
int mid=(len>>1)+1,tmp1,tmp2;
if(k<mid)
{
tmp1=(gethash(1,k-1)*mypow[Base,mid-k]%MOD+gethash(k+1,mid))%MOD;
tmp2=gethash(mid+1,len);
if(tmp1==tmp2) return 1;
else return 0;
}
else if(k>mid)
{
tmp1=gethash(1,mid-1);
tmp2=(gethash(mid,k-1)*mypow[Base,len-k]%MOD+gethash(k+1,len))%MOD;
if(tmp1==tmp2) return 1;
else return 0;
}
else
{
tmp1=gethash(1,mid-1);
tmp2=gethash(mid+1,len);
if(tmp1==tmp2) return 1;
else return 0;
}
}
void wri(char *s,int len,int k)
{
int i,mid=(len>>1)+1;
if(k<=mid)
{
for(i=1;i<k;i++) printf("%c",s[i]);
for(i=k+1;i<=mid;i++) printf("%c",s[i]);
}
else if(k>mid)
{
for(i=1;i<=mid;i++) printf("%c",s[i]);
}
}
signed main()
{
int i,j;
std::cin>>n;
std::cin>>s+1;
if(n%2==0)
{
std::cout<<"NOT POSSIBLE";
return 0;
}
init(s,n);
for(i=1;i<=n;i++)
if(check(s,n,i)==1)
flag++,p=i;
if(flag==0)
std::cout<<"NOT POSSIBLE";
else if(flag>1)
std::cout<<"NOT UNIQUE";
else
wri(s,n,p);
return 0;
}#include<bits/stdc++.h>
#define int long long
const int MAXN=2e6+10;
const int Base=131;
const int MOD=2147364847;
int n;
char s[MAXN];
int hash[MAXN],mypow[MAXN];
int flag,p;
void init(char *s,int len)
{
int i,j;
hash[0]=0;
mypow[0]=1;
for(i=1;i<=len;i++)
{
hash[i]=hash[i-1]*Base+(int)(s[i]);
hash[i]%=MOD;
mypow[i]=mypow[i-1]*Base;
mypow[i]%=MOD;
}
}
int gethash(int l,int r)
{
return (hash[r]-hash[l-1]*mypow[Base,r-l+1]%MOD+MOD)%MOD;
}
int check(char *s,int len,int k)
{
int mid=(len>>1)+1,tmp1,tmp2;
if(k<mid)
{
tmp1=(gethash(1,k-1)*mypow[Base,mid-k]%MOD+gethash(k+1,mid))%MOD;
tmp2=gethash(mid+1,len);
if(tmp1==tmp2) return 1;
else return 0;
}
else if(k>mid)
{
tmp1=gethash(1,mid-1);
tmp2=(gethash(mid,k-1)*mypow[Base,len-k]%MOD+gethash(k+1,len))%MOD;
if(tmp1==tmp2) return 1;
else return 0;
}
else
{
tmp1=gethash(1,mid-1);
tmp2=gethash(mid+1,len);
if(tmp1==tmp2) return 1;
else return 0;
}
}
void wri(char *s,int len,int k)
{
int i,mid=(len>>1)+1;
if(k<=mid)
{
for(i=1;i<k;i++) printf("%c",s[i]);
for(i=k+1;i<=mid;i++) printf("%c",s[i]);
}
else if(k>mid)
{
for(i=1;i<=mid;i++) printf("%c",s[i]);
}
}
signed main()
{
int i,j;
std::cin>>n;
std::cin>>s+1;
if(n%2==0)
{
std::cout<<"NOT POSSIBLE";
return 0;
}
init(s,n);
for(i=1;i<=n;i++)
if(check(s,n,i)==1)
flag++,p=i;
if(flag==0)
std::cout<<"NOT POSSIBLE";
else if(flag>1)
std::cout<<"NOT UNIQUE";
else
wri(s,n,p);
return 0;
}
改了无数个模数都是这个结果