国王的魔镜

来源:互联网 发布:centos官网下载镜像 编辑:程序博客网 时间:2024/06/04 08:12

国王的魔镜

时间限制:3000 ms  |  内存限制:65535 KB
难度:1
描述
国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。

比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话,魔镜会把这条项链变为ABBA。如果再用一端接触的话,则会变成ABBAABBA(假定国王只用项链的某一端接触魔镜)。

给定最终的项链,请编写程序输出国王没使用魔镜之前,最初的项链可能的最小长度。

输入
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据占一行 只有一个字符串(长度小于100),由大写英文字母组成,表示最终的项链。
输出
每组测试数据的输出只有一个整数,表示国王没使用魔镜前,最初的项链可能的最小长度。
样例输入
2ABBAABBAA
样例输出
21
来源
2008年小学生程序设计友谊赛试题
上传者

ACM_赵铭浩


问题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=264


问题分析:

1当输入长度len为奇数时,直接输出字符串的长度;

2当len为偶数时,则先判断其是否为回文,若不是回文,则直接输出其长度;

3若是回文,则返回第二步进一步判断其一半是否为回文。

代码:

#include <iostream>  #include <stdio.h>   #include <string.h>  #include <math.h>  #include <vector>  #include <queue>  #include <stack>  #include <map>  #include <string>  #include <algorithm>  #include <iomanip>using namespace std;/* run this program using the console pauser or add your own getch, system("pause") or input loop */char input[101];bool isHuiwen(int ans){int i=0,j=ans-1;while(i<j){if(input[i] != input[j]){return false;}i++,j--;}return true;}int main(int argc, char** argv) {/*freopen("file/input.txt","r",stdin);freopen("file/output.txt","w",stdout);*/int n;scanf("%d",&n);getchar();while(n--){scanf("%s",input);int ans=strlen(input);while(ans%2 == 0 && isHuiwen(ans)){ans/=2;} printf("%d\n",ans);}return 0;}
代码分析:

注意当len为偶数时,当遇到AA这种输入时,ans会除到1,此时因为1是奇数,因此进行输出。

原创粉丝点击