📜  门|门 CS 1997 |问题 5(1)

📅  最后修改于: 2023-12-03 15:28:47.743000             🧑  作者: Mango

门|门 CS 1997 |问题 5

简介

本题是第五道题目,属于清华大学《计算机程序设计基础》1997级门|门系列考试题,是一道考验程序员问题解决能力的编程练习。本题需要使用C\C++完成,需要掌握基本的输入输出、字符串处理、循环等语法知识。

题目描述

给定一个由字符'0'和'1'组成的字符串,你的任务是判断它能否分成长度为x和y的两个非空子串,使得这两个子串完全相同。换句话说,就是在字符串中找到两个不同的起点,这两个起点到字符串末尾都一样长,并且这两个起点之间的距离等于x和y。

输入格式

输入文件只有一行,包含一个由字符'0'和'1'组成的字符串,长度在2和10^5之间。

输出格式

对于每组测试数据,输出一行,如果字符串可以分成符合条件的两个子串,输出"YES",否则输出"NO"。

样例输入
10011001
样例输出
YES
解题思路

我们可以枚举x和y的长度,然后遍历整个字符串,检查是否存在相等的两个子字符串。具体实现时,我们可以使用字符串的substr()函数来获得从指定位置开始的子字符串,然后比较这两个子字符串是否相等。

代码示例
#include <iostream>
#include <string>

using namespace std;

int main() {
    string s;
    cin >> s;
    int n = s.size();
    bool flag = false;
    for (int i = 1; i < n; i++) {
        if (n % i != 0) continue; // 保证能够整除
        string substr1 = s.substr(0, i), substr2 = s.substr(i, i);
        if (substr1 == substr2) {
            flag = true;
            break;
        }
    }
    if (flag) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
    }
    return 0;
}
总结

本题考察了程序员的字符串处理能力和循环逻辑,需要注意的是循环的边界条件和检查整除的操作。掌握了本题的解题思路,可以极大的提高我们的编程能力。