东方博宜24年12月-A组(萌新)- 咒语

题目描述


传说中,有一位占卜师掌握着一种奇特的咒语。如果一个咒语可以被重复施展一次,便能召唤出古老的力量。
现在,给你一个咒语字符串 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;
}

代码说明:

  1. 读取咒语长度 N 和咒语字符串 S
  2. 检查 N 是否为偶数。如果是偶数,才有可能将字符串分成两个相等的部分。
  3. 使用 substr 函数提取字符串的前半部分 T1 和后半部分 T2
  4. 比较这两个部分,如果相等,则输出 "Yes";否则输出 "No"。
  5. 如果字符串长度 N 是奇数,则直接输出 "No"。

该方法简单且高效,适用于所有满足 1 ≤ N ≤ 100 的情况。您可以根据样例输入测试该程序,确保它符合预期的输出结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值