P6739

[BalticOI 2014 Day1] Three Friends

题目描述

有一个字符串 \(S\),对他进行操作:

  1. \(S\) 复制为两份,存在字符串 \(T\)
  2. \(T\) 的某一位置上插入一个字符,得到字符串 \(U\)

现在给定 \(U\),求 \(S\)

输入格式

第一行一个整数 \(N\) 代表 \(U\) 的长度。
第二行 \(N\) 个字符代表字符串 \(U\)

输出格式

  • 如果不能通过上述的步骤从 \(S\) 推到 \(U\),输出 NOT POSSIBLE
  • 如果从 \(U\) 得到的 \(S\) 不是唯一的,输出 NOT UNIQUE
  • 否则,输出一个字符串 \(S\)

样例 #1

样例输入 #1

7
ABXCABC

样例输出 #1

ABC

样例 #2

样例输入 #2

6
ABCDEF

样例输出 #2

NOT POSSIBLE

样例 #3

样例输入 #3

9
ABABABABA

样例输出 #3

NOT UNIQUE

提示

数据规模与约定

本题采用捆绑测试。

  • Subtask 1(35 pts):\(N \le 2001\)
  • Subtask 2(65 pts):无特殊限制。

对于 \(100\%\) 的数据,\(2 \le N \le 2 \times 10^6+1\),保证 \(U\) 中只包含大写字母。

由于只插入一个字母 所以前半和后半必有一个为目标字符串 枚举判断即可
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n;string s;int cnt;string ans;
map<char,int>cs;
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>s;
	if(n%2==0)
	{
		cout<<"NOT POSSIBLE\n";
		return 0;
	}
	int m=(n-1)/2;
	s=" "+s;
	string s1=s.substr(1,m);
	string s2=s.substr(m+2,m); 
	s1=" "+s1;s2=" "+s2;
	int pos=m+1;
//	cout<<s1<<" "<<s2<<"\n";
	for(int i=1;i<=m;i++)
	{
//		cout<<s1[i]<<"   "<<s[pos]<<"\n";
		if(s1[pos]==s[i])pos++;
	}
//	cout<<pos<<"\n";
	int flag1=0,flag2=0;
	if(pos==m+1)flag1=1;
	pos=1;
	for(int i=m+2;i<=n;i++)
	{
//		cout<<s[i]<<","<<s2[pos]<<"\n";
		if(s[i]==s2[pos])pos++;
	}
//	cout<<pos<<"\n";
	s1=s1.substr(1,m);
//	cout<<s1<<"\n";
	s2=s2.substr(1,m);
	if(pos==m+1)flag2=1;
	if(!flag1&&!flag2)cout<<"NOT POSSIBLE\n";
	else if(flag1&&flag2&&s1!=s2)cout<<"NOT UNIQUE\n";
	else if(flag1)cout<<s1<<"\n";
	else cout<<s2<<"\n";
	
	return 0;
}
posted @ 2023-01-14 22:33  PKU_IMCOMING  阅读(26)  评论(0)    收藏  举报