描述
国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。
比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话,魔镜会把这条项链变为ABBA。如果再用一端接触的话,则会变成ABBAABBA(假定国王只用项链的某一端接触魔镜)。
给定最终的项链,请编写程序输出国王没使用魔镜之前,最初的项链可能的最小长度。
输入
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据占一行 只有一个字符串(长度小于100),由大写英文字母组成,表示最终的项链。
输出
每组测试数据的输出只有一个整数,表示国王没使用魔镜前,最初的项链可能的最小长度。
样例输入
2
ABBAABBA
A
样例输出
2
1
代码如下
#include < stdio.h>
#include < string.h>
int hansu(char * , int );
int main()
{
int n,len;
char a[101];//定义一个字符数组;
scanf(“%d”, &n);
getchar();//首先输出n组数据,getchar吞掉换行;
while(n–)
{
scanf(“%s”, a);//输入该字符数组;
len = strlen(a);//len计算出该字符数组的长度;
if(len%2 != 0)//如果该字符数组的长度是奇数的话,表示没有使用魔镜对称,即原样输出即可;
printf(“%d\n”, len);
else
printf(“%d\n”, hanshu(a, len));//如果是偶数,进行hanshu这个函数进一步判断;
}
return 0;
}
int hanshu(char * a, int len)
{
int i, j;
for(i=0; i< len; i++)
{
if(a[i] != a[len-1-i])//hanshu如果说,第一个跟它对称的那个最后一个数不一样的话,即没有复制;
return len;//原样返回;
}
if((len/2)%2 != 0)//如果上面一个for循环,没有进行,那就减半再次进行判断;
return len/2;//如果减半后,是奇数,输出减半后的结果;
else
{
len /= 2;
return hanshu(a, len);//否则的话,接着减半之后再次进行此hanshu这个函数循环;
}
}