UVa644 立即可解码性

思想:主要受上一题10815的启发,对每组数据在进行前缀判断时,可以先排序(因为排序后再判断的话,只需要判断相邻的即可),再遍历所有元素,对其与其相邻(后一个)元素进行前缀判断。其中前缀判断是用strncmp的第三个参数指定前n个字符比较。

Code:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int cmp_string(const void* _a, const void* _b);
void imdecode(int n, int k);
char code[10][20];

int main()
{
	int i = 0;//每组数据有i个code,即行数 
	int j = 1;//第j组数据 
	memset(code, 0, sizeof(code));
	while ((scanf("%s", code[i])) != EOF)//注意别忘了写!=EOF,否则意思是scanf成功读入0个值,不是检测到文件结尾。。 
	{//输入数据以EOF结束 
		if (code[i][0] == '9')
		{//一组数据 
			//for(int k=0;k<i;++k)
			//printf("%d: %s\n",k,code[k]);
			imdecode(i, j);
			j++;

			memset(code, 0, sizeof(code));
			i = 0;
		}
		else
			i++;
	}//while
	return 0;
}

void imdecode(int n, int k)
{
	qsort(code, n, sizeof(code[0]), cmp_string);//第三个参数是各元素占用空间大小,是sizeof,不是strlen。。。 
	bool b = 1;
	for (int i = 0; i<n; ++i)
	{
		if (strncmp(code[i + 1], code[i], strlen(code[i])) == 0)
		{
			//printf("%d:%s\n%d:%s\n",i+1,code[i+1],i,code[i]); 
			b = 0;
		}
	}
	if (b)
		printf("Set %d is immediately decodable\n", k);
	else
		printf("Set %d is not immediately decodable\n", k);
}

int cmp_string(const void* _a, const void* _b)
{
	char* a = (char*)_a;
	char* b = (char*)_b;
	return strcmp(a, b);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值