Description | ||
冰墩墩和玩偶题目描述你有2n个冰墩墩玩偶,这些冰墩墩可能是不同种类的。你将其摆成一行,然后将其从中间对半分成两个长度相同的两行,不断重复这个过程,直到所有行都只剩下一个冰墩墩。 在这个过程中,产生过多少种不同冰墩墩排列? 比如你有2种共8个冰墩墩,我们用 其中一共出现了9种不同的冰墩墩排列: 现在给你最初的冰墩墩排列,请问这个过程中一共产生了多少种不同的冰墩墩排列? 输入格式第一行是一个整数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;
}