神奇o(n)模拟思路但是wa了少数几个not possible的点
查看原帖
神奇o(n)模拟思路但是wa了少数几个not possible的点
1065103
Atri_Lobato楼主2024/7/7 15:34

思路与题解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;
}
2024/7/7 15:34
加载中...