描述国王有一个魔镜可以把任何接触镜面的东西变成原来的两倍——只是因为是镜子嘛增加的那部分是反的。 比如一条项链我们用AB来表示不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话魔镜会把这条项链变为ABBA。如果再用一端接触的话则会变成ABBAABBA假定国王只用项链的某一端接触魔镜。 给定最终的项链请编写程序输出国王没使用魔镜之前最初的项链可能的最小长度。输入描述只有一个字符串由大写英文字母组成
输入的字符串表示最终的项链,我们要求的是国王没使用魔镜之前,最初的项链可能的最小长度。
观察题目中的例子可以发现,最初的项链由两个相同的子项链组成,且这两个子项链的长度是相等的。考虑到项链的对称性,我们可以假设最初的项链是由一个子项链重复两次得到的。
假设最初的项链长度为n,那么最终的项链长度为2n,根据题意,最终的项链可以通过对最初的项链的某一端接触魔镜得到。因此,最终的项链可以划分为两个部分,每个部分长度为n。
如果最终的项链为ABBAABBA,那么最初的项链应为ABBA。如果最终的项链为ABBA,那么最初的项链应为AB。
可以发现,最初的项链的长度就是最终的项链的长度的一半。因此,我们只需要计算最终的项链的长度除以2即可得到最初的项链可能的最小长度。
具体算法如下:
- 读取输入的最终的项链字符串。
- 计算最终的项链字符串的长度。
- 将最终的项链字符串的长度除以2,得到最初的项链可能的最小长度。
- 输出最初的项链可能的最小长度。
以下是C++的实现代码:
#include <iostream>
#include <string>
using namespace std;
int main() {
string necklace;
cin >> necklace;
int finalLength = necklace.length();
int initialLength = finalLength / 2;
cout << initialLength << endl;
return 0;
}
希望对你有帮助!
原文地址: https://www.cveoy.top/t/topic/i2JH 著作权归作者所有。请勿转载和采集!