[BalticOI 2014 Day1] Three Friends
题目描述
有一个字符串 S S S,对他进行操作:
- 将 S S S 复制为两份,存在字符串 T T T 中
- 在 T T T 的某一位置上插入一个字符,得到字符串 U U U
现在给定 U U U,求 S S S。
输入格式
第一行一个整数
N
N
N 代表
U
U
U 的长度。
第二行
N
N
N 个字符代表字符串
U
U
U。
输出格式
- 如果不能通过上述的步骤从
S
S
S 推到
U
U
U,输出
NOT POSSIBLE
。 - 如果从
U
U
U 得到的
S
S
S 不是唯一的,输出
NOT UNIQUE
。 - 否则,输出一个字符串 S S 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 ≤ 2001 N \le 2001 N≤2001。
- Subtask 2(65 pts):无特殊限制。
对于 100 % 100\% 100% 的数据, 2 ≤ N ≤ 2 × 1 0 6 + 1 2 \le N \le 2 \times 10^6+1 2≤N≤2×106+1,保证 U U U 中只包含大写字母。
说明
翻译自 BalticOI 2014 Day1 B Three Friends。
读题
经典的hash题啊,用hash做是不错的,效率很高,那么就让笔者用string水了吧。
代码
#include<bits/stdc++.h>
#include<string>
using namespace std;
string a,b,s;
bool f1=0,f2=0;
int l=0;
int main() {
int n;
cin>>n>>s;
if (!(n&1)) cout<<"NOT POSSIBLE";
else {
int x=n/2;
a = s.substr(0,x);
b = s.substr(n-x,x);
for (int i=x;i<=n-1 and l<x;i++)
if (s[i]==a[l]) l++;
if (l==x) f1=1;
l=0;
for (int i=0;i<=n-x-1 and l<x;i++)
if (s[i]==b[l]) l++;
if (l==x) f2=1;
if (!f1 and !f2) cout<<"NOT POSSIBLE";
else if (f1 and f2 and a!=b) cout<<"NOT UNIQUE";
else
if (f1) cout<<a; else cout<<b;
}
return 0;
}
分析
hash题就用hash做,但笔者选择string+暴力,并采用压行技术,让代码可读性提到最高了
这段代码是用于判断给定字符串是否可拆分为两个相等的部分的算法。我来解释一下代码的逻辑:
初始
通过 cin 输入一个整数 n 和一个字符串 s。
接下来的条件判断语句 if (!(n&1)) cout<<“NOT POSSIBLE”; 检查 n 是否为奇数,如果是偶数,则输出 “NOT POSSIBLE”,表示无法拆分成两个相等的部分。至于((!(n&1))的意义与原理,留给读者思考。
否则,计算出拆分位置 x,即 n/2。后面需以x为界限进行匹配即可。
使用 string::substr 函数将字符串 s 分别拆分成前半部分 a 和后半部分 b。
判断
使用 for 循环遍历字符串 s 的后半部分,比较每个字符是否与 a 中对应位置的字符相同,如果相同,则将 l ++。这里的变量 l 是一个计数器,用于记录成功匹配的字符数量。
如果 l == x,则表示成功匹配了 x 个字符,将 f1 设置为 true,表示前半部分 a 是可行的。
清零 l,重复以上的过程,但这次遍历的是字符串 s 的前半部分,比较每个字符是否与 b 中对应位置的字符相同。
同样,如果 l 等于 x,则表示成功匹配了 x 个字符,将 f2 设置为 true,表示后半部分 b 是可行的。
根据 f1 和 f2 的取值,输出结果。如果两者都为 false,则输出 “NOT POSSIBLE”;如果两者都为 true,且 a 不等于 b,则输出 “NOT UNIQUE”;否则根据 f1 的取值输出 a 或 b。(想一想,为什么)文章来源:https://www.toymoban.com/news/detail-498873.html
end
string过hash,是种技巧吧。文章来源地址https://www.toymoban.com/news/detail-498873.html
到了这里,关于Three Friends的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!