ACM复习(40)10693 PKKJ的生日礼物

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

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

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

输入样例
2
4
happy
birthday
to
pkkj
4
happy
hat
h
ha

输出样例
4
2

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


解题思路

最简单的方法就是直接写个冒泡两两比较是不是前缀

#include<stdio.h>
int main()
{
    int t, n, total, e, q;
    char str[51][51];
    scanf("%d", &t);
    while(t --)
    {
        scanf("%d", &n);
        total = n;
        for(int i = 0; i < n; i ++)
            scanf("%s", &str[i]);
        for(int i = 0; i < n - 1; i ++)
        {
            // 首字符为0代表该字符串是其它串的前缀
            if(str[i][0] == '0')
                continue;
            for(int j = i + 1; j < n; j ++)
            {
                if(str[i][0] == '0')
                    break;
                e = q = 0;
                while(str[i][e] != '\0' && str[j][q] != '\0' && str[i][e] == str[j][q])
                {
                    e ++;
                    q ++;
                }
                if(str[i][e] == '\0' || str[j][q] == '\0') 
                {
                    if(str[i][e] == '\0')
                        str[i][0] = '0';
                    else
                        str[j][0] = '0';
                    total -= 1;
                }
            }
        }   
        printf("%d\n", total);
    }
    return 0;
}   

猜你喜欢

转载自blog.csdn.net/sinat_34200786/article/details/79589004