题目大意:可解码的条件是:任意两个codeA和B,A不是B的前缀,B也不是A的前缀。
解题过程:主要两个思路:1、字符串部分比较;2、转成数值比较,C=B/A,判断C在2的n次方到m次方之间,D=B-(A*pow(2,n)),if D<pow(2,n),则A是B的前缀。仔细想了想,思路2有点脱裤子放屁的感觉,即使是在面对特别长的字符串的时候,思路2也用不上,因为当字符串特别长时,数值的大小是存不下的,还得使用高精度计算方法,得不偿失。用了思路1,一次AC。
注意:strcmp()函数的比较过程比较有特点,先看对应位字母排序,字母排序都相等时长度更长的字符串比较“大”:
01 0000
10 01
010 010
0000 10
正确代码:
# include <cstdio>
# include <cstdlib>
# include <ctime>
# include <cmath>
# include <iostream>
# include <fstream>
# include <cstring>
# include <string>
//*
#define fin cin
#define fout cout
//*/
using namespace std;
/*
ifstream fin("in.txt");
ofstream fout("out.txt");
//*/
char code[8][20];
int cmp(const void* a,const void *b){
return strcmp((char*)a,(char*)b);
}
bool isprefix(char* f,char* b){
char t1[20],t2[20];
strcpy(t1,f);
strcpy(t2,b);
t2[strlen(f)]='\0';
t1[strlen(b)]='\0';
if(strcmp(t1,t2)==0) return true;
else return false;
}
int main()
{
int numofcode,times=0;
int i;
while(cin>>code[0]){
for(i=1;;i++){
fin>>code[i];
if(code[i][0]=='9') break;
}
numofcode=i;
qsort(code,numofcode,sizeof(code[0]),cmp);
/*
for(int i=0;i<numofcode;i++){
fout<<code[i]<<endl;
}
*/
bool flag;
for(int i=0;i<numofcode;i++){
for(int j=i+1;j<numofcode;j++){
flag=isprefix(code[i],code[j]);
if(flag) break;
}
if(flag) break;
}
times++;
fout<<"Set "<<times<<" is ";
if(flag) fout<<"not immediately decodable"<<endl;
else fout<<"immediately decodable"<<endl;
}
return 0;
}