题目描述
传说中,有一位占卜师掌握着一种奇特的咒语。如果一个咒语可以被重复施展一次,便能召唤出古老的力量。
现在,给你一个咒语字符串 S,你需要判断是否存在一个非空的子咒语 T,使得整个咒语可以通过连续施展两次 T 完成。
如果存在这样的子咒语,请回答 Yes,否则回答 No。
输入
第一行为整数 N,表示咒语长度。
第二行一个字符串 S,表示占卜师的咒语。
输出
如果咒语符合条件,输出 Yes,否则输出 No。
样例
输入
6
efgefg
输出
Yes
输入
6
efgegf
输出
No
输入
1
w
输出
No
说明
样例 1 解释
咒语 efgefg,可以由非空子咒语 efg 施展两次得到。 即 efgefg=efg+efg,因此存在符合条件的子咒语。
数据规模
对于 100% 的测评数据,满足1≤N≤100。
分析
根据题目的要求,我们需要判断一个字符串是否可以由其某个非空子串重复两次构成。我们可以通过检查字符串的长度是否为偶数并且其前半部分是否与后半部分相等来实现这一点。
代码
以下是 C++ 代码实现:
#include <iostream>
#include <string>
int main() {
int N;
std::cin >> N; // 读取咒语长度
std::string S;
std::cin >> S; // 读取咒语字符串
// 只有在长度为偶数的情况下才可能有重复的子串
if (N % 2 == 0) {
std::string T1 = S.substr(0, N / 2); // 取前半部分
std::string T2 = S.substr(N / 2, N / 2); // 取后半部分
// 比较前半部分和后半部分
if (T1 == T2) {
std::cout << "Yes" << std::endl;
return 0;
}
}
std::cout << "No" << std::endl; // 如果不满足条件,输出 No
return 0;
}
代码说明:
- 读取咒语长度
N
和咒语字符串S
。 - 检查
N
是否为偶数。如果是偶数,才有可能将字符串分成两个相等的部分。 - 使用
substr
函数提取字符串的前半部分T1
和后半部分T2
。 - 比较这两个部分,如果相等,则输出 "Yes";否则输出 "No"。
- 如果字符串长度
N
是奇数,则直接输出 "No"。
该方法简单且高效,适用于所有满足 1 ≤ N ≤ 100
的情况。您可以根据样例输入测试该程序,确保它符合预期的输出结果。