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