描述
Steve从MCBBS中找到了他最喜欢的神秘时代模组,他迫不及待地就把模组下进了自己的电脑,在几天的快乐游玩之后,Steve充分地熟悉了这个模组,他决定叫上好友Alex一起去探险。神秘时代中最开始也是最重要的物品是神秘魔镜,Steve好不容易搜集了所有物品,合成了有生の年第一面魔镜,他非常开心,于是决定把这面魔镜送给Alex。这是个十分神奇的魔镜:如果Alex拿着一张写有“AB”的纸条,如果把B端接触镜面的话,魔镜会把这个纸条变成“ABBA”,如果再用右端接触的话,就会变成“ABBAABBA”。现在Alex有一张变化后的纸条,她想让Steve用程序帮她求出这张纸条没有接触魔镜之前最小长度。假如你是Steve,你该如何帮助Alex解决这个问题呢?
输入
只有一个字符串,由大写英文字母组成(长度<=100000),表示最终的纸条。数据保证纸条每次都是右端接触镜面
输出
只有一个整数,表示纸片没有变化前最小长度。
样例输入
【样例1】
ABBCAACBBA
【样例2】
ABBAABBA
样例输出
【样例1】
5
【样例2】
2
提示
【样例说明】
样例1:
观察ABBCAACBBA可知ABBCAACBBA由ABBCA右端接触镜面所得,并且ABBCA不能有其他长度更小的纸片接触魔镜变化所得,所以该纸片最小长度为5
样例2:见题意
给你一个思路吧,根据题意知道不管如何去触碰镜子,所得到的字符串一定是对称的。所以使用一个递归不停的比较。
知道左右2边不对称,则说明已经找到了最小长度
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
char str[100000];
int change(int len) {
int i = 0, j = len - 1;
while (i < j) {
if (str[i] != str[j])
return 0;
i++; j--;
}
return 1;
}
int main() {
cin >> str;
int len = strlen(str);
while (!(len & 1) && change(len))
len /= 2;
cout << len << endl;
return 0;
}