昨天过节去了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
****************************************************************/