2020-2-15赛

昨天过节去了hhhhh

问题 B: 简写单词

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

最近情报人员得到了一些经过加密的文章,每个单词都很长。破译人员想到先把单词化简一下,方法是把每个单词尽量取短些的前缀,但所取的前缀不能是其它单词的前缀。
    这个任务现在就交给你来完成。
   解释:“字符串s1是s2的前缀”是说把字符串s2的后面去掉某些,只保留与s1相同长度时,s2就与s1完全相同。如:"abc"是"abcaade"和"abc"的前缀,但不是"ababc"的前缀。

输入

第一行一个整数N,表示单词个数。
下面有N行,每行一个单词。

输出

共N行,每行一个单词,是对应上面的N个单词的化简后的单词。

扫描二维码关注公众号,回复: 9217271 查看本文章

样例输入 Copy

【样例1】
3
abc
efg
ijh
【样例2】
3
aac
aad
aae

样例输出 Copy

【样例1】
a
e
i
【样例2】
aac
aad
aae

提示

单词数N,1<=N<=50;每个单词长度不超过50;并且单词都由小写字母构成。
保证所给单词没有一个单词是另一个单词的前缀。

第一次输出超限的代码
#include <bits/stdc++.h>
using namespace std;
const int mod=1e5+5;
typedef long long ll;
char str[55][55];
//priority_queue<int>q;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        scanf("%s",str[i]);
    }
    for(int i=1; i<=n; i++)
    {
 
        int len=strlen(str[i]);
        int maxn=0;
        for(int k=1; k<len; k++)
        {
            int f=1;maxn=0;
            for(int j=1; j<n; j++)
            {
                if(j==i)
                    continue;
                for(int st=0; st<k; st++)
                {
                    if(str[i][st]==str[j][st])
                    {
                        f=0;
                        break;
                    }
                }
                if(f==0)
                    break;
            }
            if(f==1)
                maxn=k;
        }
        for(int j=0;j<len;j++)
        {
            if(j<maxn) continue;
            else printf("%c",str[i][j]);
        }
        if(i!=n)printf("\n");
    }
 
    return 0;
}
 
/**************************************************************
    Problem: 14468
    User: 2019UPC110
    Language: C++
    Result: 输出超限
****************************************************************/
//memcmp这个函数很不错哦
#include <bits/stdc++.h>
using namespace std;
const int mod=1e5+5;
typedef long long ll;
char str[55][55];
//priority_queue<int>q;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        scanf(" %s",str[i]);
    }
    for(int i=1; i<=n; i++)
    {
 
        int len=strlen(str[i]);
        for(int k=1; k<=len; k++)
        {
            int f=0;
            for(int j=1;j<=n;j++)
            {
                if(i!=j&&memcmp(str[i],str[j],k)==0)//判断两个字符串在前k个字符是否相等。
                {
                    f=1;break;
                }
            }
            if(f==0) str[i][k]='\0';///***
        }
    }
    for(int i=1;i<=n;i++)
    {
        printf("%s\n",str[i]);
    }
 
    return 0;
}
 
/**************************************************************
    Problem: 14468
    User: 2019UPC110
    Language: C++
    Result: 正确
    Time:5 ms
    Memory:2024 kb
****************************************************************/
发布了32 篇原创文章 · 获赞 1 · 访问量 1332

猜你喜欢

转载自blog.csdn.net/QXK_Jack/article/details/104328995
今日推荐