P6739
[BalticOI 2014 Day1] Three Friends
题目描述
有一个字符串 \(S\),对他进行操作:
- 将 \(S\) 复制为两份,存在字符串 \(T\) 中
- 在 \(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;
}
此生无悔入OI 来生AK IOI

浙公网安备 33010602011771号