NYOJ:264国王的魔镜

来源:互联网 发布:2018mpacc知乎 编辑:程序博客网 时间:2024/04/30 21:23

国王的魔镜

描述
国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。

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

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

输入
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据占一行 只有一个字符串(长度小于100),由大写英文字母组成,表示最终的项链。
输出
每组测试数据的输出只有一个整数,表示国王没使用魔镜前,最初的项链可能的最小长度。
样例输入
2ABBAABBAA
样例输出
21
解题思路:如果这个串的长度是奇数,那么这个串就不可能是经过镜面对称得来的,所以串的最小长度就是它本身,如果串是偶数,还要讨论一种情况,如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;
}

0 0
原创粉丝点击