思路与题解1相同但不完全一样,总的来说就是一个模拟。 分两类情况匹配前半段和后半段,有一次跳跃不同字符的机会,当再次出现不同字符但跳跃机会用完后就代表该情况不成立
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
using namespace std;
int l;
char s[2000005];
char a[2000005];
int la=0;
char b[2000005];
int lb=0;
int ol;
int main()
{
scanf("%d",&l);
if(l%2==0)
{
cout<<"NOT POSSIBLE";
return 0;
}
scanf("%s",s+1);
int q,i;
bool flag1=0,flag2=0;
ol=l/2;
//front
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
for(int i=1;i<=ol+1;i++)
{
a[i]=s[i];
la=i;
}
for(int i=ol+2;i<=l;i++)
{
b[i-ol-1]=s[i];
lb=i-ol-1;
}
// for(int t=1;t<=la;t++)
// cout<<a[t];
// cout<<endl;
// for(int t=1;t<=lb;t++)
// cout<<b[t];
// cout<<endl;
bool tmp=1;
for(q=1,i=1;q<=lb;q++)
{
// cout<<"a["<<i<<"] = "<<a[i]<<endl;
// cout<<"b["<<q<<"] = "<<b[q]<<endl;
if(a[i]==b[q])
{//cout<<1<<endl;
if(q==lb)
{
flag1=1;
}
i++;
}
else
{//cout<<2<<endl;
if(tmp)
{
i+=1;
// cout<<"a["<<i<<"] = "<<a[i]<<endl;
// cout<<"b["<<q<<"] = "<<b[q]<<endl;
if(a[i]==b[q])
if(q==lb)
{
flag1=1;
}
i++;
tmp=0;
}
else
{
break;
}
}
}
//back
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
for(int i=1;i<=ol;i++)
{
a[i]=s[i];
la=i;
}
for(int i=ol+1;i<=l;i++)
{
b[i-ol]=s[i];
lb=i-ol;
}
// tmp=1;
// for(int t=1;t<=la;t++)
// cout<<a[t];
// cout<<endl;
// for(int t=1;t<=lb;t++)
// cout<<b[t];
// cout<<endl;
tmp=1;
for(i=1,q=1;i<=la;i++)
{
// cout<<"a["<<i<<"] = "<<a[i]<<endl;
// cout<<"b["<<q<<"] = "<<b[q]<<endl;
if(a[i]==b[q])
{//cout<<1<<endl;
if(i==la)
{
flag2=1;
}
q++;
}
else
{//cout<<2<<endl;
if(tmp)
{
q+=1;
// cout<<"a["<<i<<"] = "<<a[i]<<endl;
// cout<<"b["<<q<<"] = "<<b[q]<<endl;
if(a[i]==b[q])
if(i==la)
{
flag2=1;
}
q++;
tmp=0;
}
else
{
break;
}
}
}
// cout<<flag1<<' '<<flag2;
if(flag1&&flag2)
{
cout<<"NOT UNIQUE";
}
else if(flag1)
{
for(int t=ol+2;t<=l;t++)
cout<<s[t];
}
else if(flag2)
{
for(int t=1;t<=ol;t++)
cout<<s[t];
}
else
{
cout<<"NOT POSSIBLE";
}
return 0;
}