冰墩墩和玩偶

Description

冰墩墩和玩偶

题目描述

你有2n个冰墩墩玩偶,这些冰墩墩可能是不同种类的。你将其摆成一行,然后将其从中间对半分成两个长度相同的两行,不断重复这个过程,直到所有行都只剩下一个冰墩墩。

在这个过程中,产生过多少种不同冰墩墩排列?

比如你有2种共8个冰墩墩,我们用ab表示这两种冰墩墩,一开始排成一行为aabaabbb,第一次分割成aaba,abbb,第二次分割成aa,ba,ab,bb,第三次分割成a,a,b,a,a,b,b,b

其中一共出现了9种不同的冰墩墩排列:aabaabbb,aaba,abbb,aa,ba,ab,bb,a,b

现在给你最初的冰墩墩排列,请问这个过程中一共产生了多少种不同的冰墩墩排列?

输入格式

第一行是一个整数T(1≤T≤1000),表示样例的个数。

以后每行一个冰墩墩排列,长度为2n , 0≤n≤10,我们使用小写英文字母来表示不同种类的冰墩墩。

输出格式

样例输入

4
a
ab
aaab
aabaabbb

样例输出

1
3
5
9
#include<stdio.h>
#include<string.h>

char input[1030]={0};
char temp[1030][514];//tmp保存的是已有的相异子串
char ram[514];//ram暂时保存的是当前取出的正在处理与比较的子串

int main()
{
    int i,j,t,len,flag,cnt,loopnt;
    scanf("%d",&t);
    while(t--)
    {
        cnt=1,loopnt=2;
    //cnt为答案的个数,所以cnt初始化为1(本身就是一个)
    //loopnt代表有几个子串,最开始可以分割出两个子串
        scanf("%s",input);
        len=strlen(input);
        len/=2;
        while(len>0)
        {
            for(i=0;i<=loopnt/2;i++)
            {
                memset(temp[i],0,len);
                //需要多少初始化多少,节省时间
                //问:为何要初始化?
                //答:在**先前**长度为len的子串中
                //当前长度为len/2的子串显然不会与先前长度为len的子串相同
                //故可以清空先前的temp数据减少遍历时间
            }
            for(i=0;i<loopnt;i++)
            {
                //取出子串
                flag=0;
                strncpy(ram,input+len*i,len);
                //i=0时取出最前面len长度的子串
                //关于这个for(i)的循环次数,即循环取出每个字串
                for(j=0;j<i;j++)
                {
                    //逐个比较
                    if(strcmp(temp[j],ram)==0)
                    {
                        flag=1;
                        break;
                        //找到相同的便标记,并且跳出循环
                    }
                }
                if(flag)
                continue;
                strcpy(temp[i],ram);
                cnt++;
            }
            loopnt*=2,len/=2;
            //进行下一次分割的处理
            //子串长度减半,子串数目翻倍
        }
        printf("%d\n",cnt);        
    }
     return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值