这个题目思路是比较简单的,但是这个题目的输入是比较绝的!!!(本人栽到输入错了几发,心塞了)
首先思路就是遍历每一个字符串和其他字符串比较看是否会产生前缀码的关系就可以了,也就是暴力。
好了现在让我来吐槽一下这个题目的输入,首先这个题目的输入要用循环读入字符的输入方式比较好,因为就是中间的空格可能有很多个,其次就是结尾有可能有空格和换行符号,因此用循环的方式输入就比较好处理。
这是我开始的输入方式:
好啦没瓜系,积累经验吧,给各位官爷上代码:
#include <stdio.h>
#include <math.h>
#include <string.h>
char x[1005][1005];
int cnt; //字符串的总个数
void input(){
char c;
int len=0;//每个字符串的长度
cnt=0; //每一次输入都要初始化字符串总数的个数哦,因为有很多个样例,一定要小心这一点哦
while(scanf("%c",&c) && c!='\n'){
if(c!=' ') x[cnt][len++]=c;
else if(len){
x[cnt][len++]='\0';//字符串的结束符号不要忘记了哦
cnt++;//开始下一个字符串了
len=0;
}
}
if(len) x[cnt++][len++]='\0';//最后一个字符串不要忘记了结束的标记符号哦
}
void solve(){
int flag=1;
//每一个字符串都和后面的比较看是否能产生前缀码的关系。
for(int i=0;i<cnt-1;i++){
int len1=strlen(x[i]);
for(int j=i+1;j<cnt;j++){
flag=1; //每一个字符串的比较都要初始化
int len2=strlen(x[j]);
int len=len1>len2?len2:len1;//取两个字符串最小的长度哦
for(int k=0;k<len;k++){
if(x[i][k]!=x[j][k]){
flag=0;
break;
}
}
if(flag) break;//如果找到了有前缀码的关系直接跳出循环
}
if(flag) break;
}
if(flag&&cnt!=1) printf("No\n"); //小心就是只有一个字符串的时候,具体的小心方式看个人的实现
else printf("Yes\n");
}
int main(){
int K;
scanf("%d",&K);
getchar();
//这个题目输入要小心,因为就是输入的时候并没有说是怎么输入的
//有可能就是中间的空格很多还有就是结尾的时候也有可能有空格还有换行符号
//因此就是用循环来输入是比较好的哦
//因此用一个字符一个字符地输入然后处理才是对的
//感觉这个题目有点绝,很卡输入,太绝了
while(K--){
input(); //输入字符串
solve(); //解决问题
}
return 0;
}
很棒呢,第三天啦,我们明天再见,继续加油哦!