国王的魔镜
-
描述
-
国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。
比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话,魔镜会把这条项链变为ABBA。如果再用一端接触的话,则会变成ABBAABBA(假定国王只用项链的某一端接触魔镜)。
给定最终的项链,请编写程序输出国王没使用魔镜之前,最初的项链可能的最小长度。
-
输入
-
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据占一行 只有一个字符串(长度小于100),由大写英文字母组成,表示最终的项链。
输出
- 每组测试数据的输出只有一个整数,表示国王没使用魔镜前,最初的项链可能的最小长度。 样例输入
-
2 ABBAABBA A
样例输出
-
2 1
解题思路:如果这个串的长度是奇数,那么这个串就不可能是经过镜面对称得来的,所以串的最小长度就是它本身,如果串是偶数,还要讨论一种情况,如AB,第一个与第二个不一样,那么二就是最小串,若长度为2,但是串为AA,则最小串长为1.可以分为:先看这个串长是否为2,如果是,看第一个字符与第二个是否相等,如果不相等,输出2,接下来判断串长是否为奇数,如果是奇数,输出字符串的长度就是答案,其他情况,将串对半劈开进行对应位置的比较,d=1,劈成两半的串有不对称的地方,出现这种情况,就输出当前串长的二倍。#include <stdio.h>#include<string.h>int main(){char a[100];int i,len,temp,num;scanf("%d" ,&num);//num组测试数据getchar();//用于接收空格while(num--){gets(a);len=strlen(a);while(1){if(len==2&&a[0]!=a[1])//串长为2,且两个字符不一样,输出串长为2{printf("2\n");break;}else if(len%2!=0)//如果串长为奇数,串不可能是镜面对称得来的,直接输出长度{printf("%d\n",len);break;}else{int d=0;len=len/2;//将串对半劈开,进行比较for(i=0;i<len;i++)if(a[i]!=a[2*len-i-1]){d=1;//代表中间有不对称的地方break;}if(d==1){printf("%d\n",2*len);//d为1代表串不是镜面对称的,结束循环,输出答案break;}}}}return 0;} -
-
第一行是一个整数N(N<=10)表示测试数据的组数)