1332: addreviate--中级

Description

最近情报人员得到了一些经过加密的文章,每个单词都很长。破译人员想到先把单词化简一下,方法是把每个单词尽量取短些的前缀,但所取的前缀不能是其他单词的前缀。
这个任务现在就交给你来完成。
解释:“字符串s1是s2的前缀”是说把字符串s2的后面去掉某些,只保留与s1相同长度是,s2就与s1完全相同。如:“abc”是“abcaade”和“abc”的前缀,但不是“abadc”的前缀。
数据范围
单词数N,1<=n<=50; 每个单词长度不超过50;并且都是由小写字母构成。
保证所给单词中,没有一个单词是另一个单词的前缀。

Input

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

Output

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

Sample Input

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

Sample Output

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

 

*一直WA,后来才发现是自己对题目的意思理解出错了,它的目的是让我们把每个单词取尽量短些的前缀,但所取的前缀不能是其它单词的前缀。

注意是每个单词,这样举个例子就知道了。

我自己的样例:

aj

ja

jb

正确的输出应该为:

a

ja

jb

所以这里我理解错了;

我一开始以为是求满足这个条件的最大长度。

#include<stdio.h>
#include<string.h>
int main(){
	int n,i,j,k,l;
	char ss[51][55];
	while(scanf("%d",&n)!=EOF){
		for(i=0;i<n;i++)
			scanf("%s",ss[i]);
		int flag=0;
		for(i=0;i<n;i++){
			l=strlen(ss[i]);
			for(k=1;k<=l;k++){
				flag=0;
				for(j=0;j<n;j++){
					if(i!=j && memcmp(ss[i],ss[j],k)==0){	//注意这个函数的作用是判断两个字符串在前k个字符是否相等。 
						flag=1; break;
					}
				}
				if(flag==0) {ss[i][k]='\0';  break;}
			}
		}
		for(i=0;i<n;i++)
			printf("%s\n",ss[i]);
	}
}


*读题还得再仔细点啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值