NEUQ OJ 1093: 小鹏的镜子

小鹏拥有一面神奇的镜子,能将接触的珍珠项链变为两倍但保持对称。当项链变为BAAB后,他忘记了原始项链的样子。给定经过多次复制的项链,编程找出最初的项链长度。输入包含多个不超过100个大写字母的字符串,输出每个字符串的初始长度。解决此问题的方法是避免逆向思维,从项链中点开始向两边查找匹配的字母。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1093: 小鹏的镜子

描述
题目描述:

小鹏有一面镜子,可以把接触的东西变成原来的两倍。但是因为是镜子嘛,只能对称变换。假如有一个为BA的珍珠项链,字母不一样代表的颜色不一样。现在小鹏用镜子将项链复制之后,项链变成了BAAB。如果再复制一遍的话,项链就会变成BAABBAAB。因为小鹏比较贪心,一直复制,最后竟然忘记原来的项链是什么样的了,接下来就请聪明的acmer编写程序,算出最开始项链的长度吧。

输入:

第一行N表示接下来有N(N<=10)个串;之后的N行,每行是一个不超过100个大写英文字母组成的串。

输出:

输出N行,每行是项链的初始长度

样例输入
2
ABBAABBA
AAAA
样例输出
2

1

第一次写这个题的时候,想的是用两个数组,第二个数组存放倒过来的后半段字符串,然后判断相等,这样写由于是逆向思维很容易正向和逆向之间产生思维错乱,导致思路非常不清晰,导致当时怎么做也做不出来,还是用从中间向两边找的老办法好理解。

#include<stdio.h>
#include<string.h>
char s[101];//存储输入的字符串
int slen(int l);//算出最开始链的长度
int main()
{
    int n,i,l;
    scanf("%d",&n);
    getchar();
    for(i=0;i<n;i++)
    {
        gets(s);
        l=strlen(s);
        printf("%d\n",slen(l));

    }



}
int slen(int l)
{
    int left,right,flag=0,i;

    if(l%2==1)
        return l;

    else
    {
        left=l/2-1;
        right=l/2;
        for(i=0;i<l/2;i++)
        {
            if(s[left-i]!=s[right+i])
            {
                flag=1;
            }

        }

    }


    if(flag==0)//比较一次相同
    {
        return slen(l/2);
    }
    else//中途发现有不相等的情况
        return l;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值