SCAU 10693 PKKJ的生日礼物

10693 PKKJ的生日礼物

时间限制:1000MS  内存限制:65535K 提交次数:0 通过次数:0

题型: 编程题   语言: 无限制

Description

    写下这题目的时间是11.24,美国时间也是11.24,以此题祝远在美帝的PKKJ彭教主生日快乐。
    生日嘛,自然少不了生日礼物的啦。这天彭教主收到来自中国的一份神秘的生日礼物(传说中是个漂亮的MM o(∩_∩)o 哈哈)。可是礼物却被一个密码锁锁了
起来(pkkj大叫一声:坑爹啊,哪个家伙这么缺德~-_-b)。在礼物箱上还附着一张纸条:嘿嘿~想知道密码吗?那就把下面的题目解出来,答案就是密码啦!
    对于一个字符串,定义它的前缀就是指字符串的任意首部。例如字符串abc的前缀有空串,a,ab,abc。
    对于一个字符串集合,如果集合中任一个元素都不是其他元素的前缀的话,我们称之为完美非前缀集合。举个例子:{”happy”, “birthday”, “to”, 
“pkkj”}就是一个完美非前缀集合,而{“happy”, “hat”, “h”}就不是完美非前缀集合。
    现在问题来了,给你一个字符串集合,你要找出一个该集合的子集,使得该子集是一个完美非前缀集合,且包含最多的元素。问你这个完美非前缀子集最多包含
多少个元素?
    由于彭教主一心只想着礼物里面的神秘MM,正所谓一心不能二用,所以他想让你帮他来解决这个难题。

Input

    第一行只有一个正整数T,表示题目共有T组数据
    对于每组数据,输入一个整数n ( 0< n <= 50 ),
    接下来有n行,每行输入一个字符串,字符串由小写字母(’a’~’z’)组成,且长度不超过50.

Output

    对于每组数据每行输出一个整数,代表一个完美非前缀子集最多包含多少个元素。

Sample Input

2
4
happy
birthday
to
pkkj
4
happy
hat
h
ha

Sample Output

4
2

Hint

对于第一组数据:该集合本身就是一个完美非前缀集合,所以包含最多元素的完美非前缀子集就是它本身,一共有4个元素
对于第二组数据,{”happy”,”hat”}是其中一个的包含最多元素的完美非前缀子集,其元素个数为2

Provider

scau_acm

 

#include<stdio.h>
#include<string.h>
int main()
{
    int i, j, len, flag, T, n, t, count;
    char ch[52][52], test[52], temp[52][52], *str;
    scanf("%d", &T);
    while(T--)
    {
        for(i=0; i<52; ++i)
        {
            memset(ch[i], 0, sizeof(char)*52);
            memset(temp[i], 0, sizeof(char)*52);
        }
        count = 0;
        scanf("%d", &n);
        t = n;
        for(i=0; i<n; ++i) 
        scanf("%s", temp[i]);
        
        for(i=1; i<n; ++i)
        {
            flag = 1;
            for(j=0; j<n-i; ++j)
            if(strlen(temp[j]) < strlen(temp[j+1]))
            {
                flag = 0; 
                memset(test, 0, sizeof(char)*52);
                strcpy(test, temp[j]);
                strcpy(temp[j], temp[j+1]);
                strcpy(temp[j+1], test);
            }
            if(flag) break;
        }

        for(t=0; t<n; ++t)
        {
            if(!count) strcpy(ch[count++], temp[t]); 
            else
            {
                for(i=0; i<count; ++i)    if((str = strstr(ch[i], temp[t])) && (str == ch[i])) break;
                if(i == count) strcpy(ch[count++], temp[t]);
            }
        }
        for(i=0; i<count; ++i)
        printf("%s\n", ch[i]);
        printf("%d\n", count);
    }
    return 0;
}

解题思路:
当时看到题目在文本上自己是这样写着的:

=================================================================================================

输入格式没问题

完美字符串:

排除空串

要不要排序?

strstr函数要不要用? 要用的时候判断返回的数字是否为1? 是1的话排除  最坏的结果是 o(n)

排除后是否第二个继续?

如果第1和合适,第k(k<n)跟后面的不配合呢?

所以输入一个串后就进行判断,而且是跟比他长的串进行判断, 不允许的话删除,允许的话排序插入

=================================================================================================

按照想法,输入一个判断一个是否符合,strstr函数已经忘记了怎么用了,愣着以为会返回第几个字符在数组中的下标,后来查找才知道返回的是指针,我在想如果是考试该怎么办呢? 代码写完了WA……

再弄几个测试数据就知道问题出在了哪里了,还是strstr函数的问题,未考虑到len(char *) < len(char *)的情况,无奈之下增添了代码进行了排序处理,还好,不会超时!!

=================================================================================================

我在想怎样才能排除尽可能多的缺陷,敲代码时考虑到更多地情况,从而达到1y的目的呢? 虽然说做的题目不多,但WA的情况也见了不少了,最终出现WA的情况会不会相同呢?

我想能够处理这问题的方法是:多做题是首要的;二是看清题目的条件;三是想清楚了才敲代码; 四是敲代码时要有严谨的思维和认真的态度;五是WA了也不要气馁,沉住气分析WA的原因(谁不是WA成山啊?大家都是踩着WA的尸体走过来的……)

转载于:https://www.cnblogs.com/liaoguifa/archive/2012/11/15/2772348.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值