| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 730 人关注过本帖
标题:一道简单的ACM题,给找找有什么特殊数据没考虑
只看楼主 加入收藏
天天涯涯
Rank: 4
等 级:业余侠客
帖 子:215
专家分:267
注 册:2011-10-17
结帖率:94.74%
收藏
已结贴  问题点数:20 回复次数:8 
一道简单的ACM题,给找找有什么特殊数据没考虑
国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。

比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话,魔镜会把这条项链变为ABBA。如果再用一端接触的话,则会变成ABBAABBA(假定国王只用项链的某一端接触魔镜)。

给定最终的项链,请编写程序输出国王没使用魔镜之前,最初的项链可能的最小长度。

输入
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据占一行 只有一个字符串(长度小于100),由大写英文字母组成,表示最终的项链。
输出
每组测试数据的输出只有一个整数,表示国王没使用魔镜前,最初的项链可能的最小长度。
样例输入
2
ABBAABBA
A
样例输出
2
1
*********************
**************************
格式输出没那么严格,
可以输入一个输出一个。

___________________-
——————————————————————————————
——————————————
#include <stdio.h>
#include <string.h>
int judge(int m,char a[])
{
    int n,i;
    m=m/2;
    if(m%2)
    {
        printf("%d\n",m);
        return 0;
    }
    else
    {
        for(i=0;i<m;i++)
            if(a[i]!=a[m-1-i])
            {
                printf("%d\n",m);
                return 0;
            }
        judge(m,a);
    }
}
int main()
{
    int n,m;
    char a[200];
    int judge(int m,char a[]);
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        scanf("%s",a);
        for(m=0;m<200;m++)
            if(a[m]=='\0')
                break;
        if(m==1)
            printf("%d\n",m);
        else
            judge(m,a);
    }
    return 0;
}
搜索更多相关主题的帖子: 项链 测试 英文字母 编写程序 字符串 
2012-02-18 16:38
天天涯涯
Rank: 4
等 级:业余侠客
帖 子:215
专家分:267
注 册:2011-10-17
收藏
得分:0 
这道题用了递归,先判断字符串的中字符的个数(一个字符除外),如果是奇数输出该字符串的个数,否则在递归函数中进行递归
2012-02-18 16:41
天天涯涯
Rank: 4
等 级:业余侠客
帖 子:215
专家分:267
注 册:2011-10-17
收藏
得分:0 
直到字符串中字符个数为奇数或左半边字符串与右半边字符串不同食,递归结束
2012-02-18 16:43
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:16 
那个天天开心是你么?
你的judge里第一句就有问题,一开始就对m除2,main里也没做判断,如果项链根本没被魔镜复制过呢?
试了一下,这是我的AC代码
程序代码:
#include<stdio.h>
#include<string.h>

int necklace_length(char * s)
{
    int i, j, len;
    for(len = strlen(s) - 1; len & 1; len = j)
    {
        for(i = 0, j = len >> 1; i <= j && s[i] == s[len - i]; i++);
        if(i <= j) break;
    }
    return len + 1;
}

int main()
{
    int n;
    char s[128];
    for(scanf("%d\n", &n); n--;)
        printf("%d\n", necklace_length(gets(s)));
    return 0;
}

重剑无锋,大巧不工
2012-02-18 17:24
巴克
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:93
专家分:199
注 册:2012-2-8
收藏
得分:0 
j = len >> 1是什么意思.(插话了.)
2012-02-18 17:37
天天涯涯
Rank: 4
等 级:业余侠客
帖 子:215
专家分:267
注 册:2011-10-17
收藏
得分:0 
你哪位
2012-02-18 17:38
天天涯涯
Rank: 4
等 级:业余侠客
帖 子:215
专家分:267
注 册:2011-10-17
收藏
得分:0 
回复 4楼 beyondyf
你哪位
2012-02-18 17:38
天天涯涯
Rank: 4
等 级:业余侠客
帖 子:215
专家分:267
注 册:2011-10-17
收藏
得分:0 
回复 5楼 巴克
len >> 1相当于len/2
2012-02-19 08:08
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:4 
相当于折半查找

                                         
===========深入<----------------->浅出============
2012-02-19 09:06
快速回复:一道简单的ACM题,给找找有什么特殊数据没考虑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022977 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved