1332: addreviate--中级

来源:互联网 发布:windows程序设计第5版 编辑:程序博客网 时间:2024/05/29 18:36

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 样例23 3abc aacefg aadijh aae

Sample Output

样例1   样例2a        aace        aadi        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]);}}


*读题还得再仔细点啊!

0 0