冰墩墩和玩偶 | ||
Accepted : 15 | Submit : 66 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB | |
冰墩墩和玩偶题目描述你有2n个冰墩墩玩偶,这些冰墩墩可能是不同种类的。你将其摆成一行,然后将其从中间对半分成两个长度相同的两行,不断重复这个过程,直到所有行都只剩下一个冰墩墩。 在这个过程中,产生过多少种不同冰墩墩排列? 比如你有2种共8个冰墩墩,我们用 其中一共出现了9种不同的冰墩墩排列: 现在给你最初的冰墩墩排列,请问这个过程中一共产生了多少种不同的冰墩墩排列? 输入格式第一行是一个整数T(1≤T≤1000),表示样例的个数。 以后每行一个冰墩墩排列,长度为2n , 0≤n≤10,我们使用小写英文字母来表示不同种类的冰墩墩。 输出格式样例输入4 a ab aaab aabaabbb 样例输出1 3 5 9 |
Source Code
Problem: 1515 User: 202205567311
Memory: 1984K Time: 483MS
Language: G++ Result: Accepted
Source Code
#include<stdio.h>
#include<string.h>
char input[1156];
char temp[1025][514];
char ram[514];
int main()
{
int i, t, j, len, pointer, cnt, loopnt;
scanf("%d", &t);
while (t--)
{
cnt = 1, loopnt = 2;//输入本身就是一个,所以cnt初始化为1,loopnt代表有几个子串
scanf("%s", input);
int len = strlen(input);
len /= 2;
while (len > 0)
{
for (i = 0; i <= loopnt; ++i)
{
memset(temp[i], 0, len + 5);//需要多少初始化多少,节省时间
}
for (i = 0; i < loopnt; ++i)//取出子串
{
pointer = 0;
strncpy(ram, input + len * i, len);//没有指针的基础可能难以理解,建议学点指针,了解指针+1的意义是什么估计容易一些
for (j = 0; j < i; ++j)
{
if (strcmp(temp[j], ram) == 0)//逐一对存储的字符串进行比较,如果有重复的,就remake,否则,把它存进数组里方便下一次比较(有空字符串,所以要初始化)
{
pointer = 1;
break;
}
}
if (pointer)
{
continue;
}
strcpy(temp[i], ram);
cnt++;
}
loopnt *= 2, len /= 2;
}
printf("%d\n", cnt);
}
}