字符串-644 Immediate Decodability

本文介绍了一种用于判断一组编码是否可立即解码的算法。通过比较任意两个编码,确保任一编码都不是另一个的前缀。利用strcmp()函数进行字符串比较,并详细展示了如何检查前缀关系。最终实现了有效的一次AC解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:可解码的条件是:任意两个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;
 } 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值