题目名字
https://www.luogu.com.cn/problem/P2799
题意
魔镜可以将任何接触到镜面的东西变成原来的两倍,但增加的部分是反的。给定最终的项链,请编写程序输出国王没使用魔镜之前,最初的项链可能的最小长度
思路
.我们可以从最终的项链的一半开始,然后将其镜像,然后与最终的项链进行比较,如果相同则找到了初始长度。如果不同,则继续减小长度,重复上述步骤,直到找到最小长度为止。
坑点
1.我们需要找到最初的项链长度,使得通过镜子操作可以得到最终的项链。这可能需要对最终的项链进行多次操作才能找到最初的项链。
- 要考虑项链的长度为奇数和偶数的情况,因为镜像操作会导致长度翻倍,可能会影响最终的项链的长度。
- 要考虑镜像操作后的项链是否与最终的项链完全匹配,包括顺序和颜色。
算法一:XX+XX
递归,回文
实现步骤
- 读取输入,获取最终的项链字符串。
- 从最终的项链长度的一半开始,逐渐减小长度,直到长度为1。
- 对于每个长度n,取最终的项链的前n个字符作为子串,然后将子串翻转并拼接到原始子串后面,得到一个可能的初始项链。
- 检查这个可能的初始项链是否与最终的项链相同,如果相同则找到了初始长度。
- 如果找到了初始长度,输出这个长度;如果没有找到,说明无法通过镜子操作得到最终的项链。
代码
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,n,a,b,c,t=0;
char str[100]={0};
scanf("%d",&n);
n=n+1;
while (n--)
{
gets(str);
a=strlen(str);
if (a%2 != 0)
{
printf("%d\n",a);
}
if (a%2==0)
{
b=a/2;
while (b!=0)
{
for (i=0; i<b; i++)
{
if (str[i]!=str[a-1-i])
break;
}
if (i != b)
{
printf("%d\n",a);
break;
}
a=a/2;
b=a/2;
if (a%2 != 0)
{
printf("%d\n",a);
break;
}
}
}
}
return 0;
}