nyoj-204

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

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

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

 
输入
第一行是一个整数N(N<=10)表示测试数据的组数) 每组测试数据占一行 只有一个字符串(长度小于100),由大写英文字母组成,表示最终的项链。
输出
每组测试数据的输出只有一个整数,表示国王没使用魔镜前,最初的项链可能的最小长度。
样例输入
2
ABBAABBA
A
样例输出
2
1
#if 0
//wa~
#include <stdio.h>
#include <string.h>
#define M 101
char s[M];

int main()
{
    int t, n, i, j, sum, min;
    scanf("%d", &t);
    while(t--){

            scanf("%s", s+1);
            n = strlen(s+1);
            min = 120;
            if(n == 1)
            {
                printf("1\n");
            }
            else
            {
                while(n){

                        for(sum = 0, i = 1, j = n; s[i] == s[j]; i++, j--)
                        {
                            if(i >= j)/*循环到对称中心的位置结束*/
                            {
                                break;
                            }
                            sum++;
                        }
                        if(sum != 0 && sum < min)
                        {
                            min = sum;
                        }
                        n /= 2;

                }
                if(min == 120)
                {
                    min = strlen(s+1);
                }
                printf("%d\n", min);

            }

    }
    return 0;
}
#endif

#if 0
//AC,最下面有个简化的
#include <stdio.h>
#include <string.h>
#define M 101
char s[M];

int main()
{
    int t, n, i, j, flag;
    scanf("%d", &t);
    while(t--){

            scanf("%s", s+1);
            n = strlen(s+1);
            flag = 0;
            while(n){

                    if(n == 1)
                    {
                        break;
                    }
                    if(n != 1 && n%2 != 0)
                    {
                        break;
                    }
                    for(i = 1, j = n; i < j; i++, j--){

                            if(s[i] != s[j])
                            {
                                flag = 1;
                                break;
                            }

                    }
                    if(flag == 1)
                    {
                        break;
                    }
                    n /= 2;                            
    
            }
            printf("%d\n", n);

    }
    return 0;
}
#endif

//我觉得上面的逻辑比较混乱,简化一下
#include <stdio.h>
#include <string.h>
#define M 102
char s[M];

int main()
{
    int t, len, i, j, flag;
    scanf("%d", &t);
    while(t--){

            scanf("%s", s+1);
            len = strlen(s+1);
            flag = 0;/*代表找到基本字符串的标志*/
            while(len % 2 == 0){

                    for(i = 1, j = len; i < j; i++, j--){

                            if(s[i] != s[j])
                            {
                                flag = 1;
                                break;
                            }

                    }
                    if(flag == 1)
                    {
                        break;
                    }
                    len /= 2;/*折半查找*/
            
            }
            printf("%d\n", len);

    }
    return 0;
}
View Code

 

posted @ 2013-09-06 09:49  心中的阿哲  阅读(200)  评论(0编辑  收藏  举报