您的位置:首页 > 其它

ZOJ 3713 In 7-bit(数学啊 )

2015-04-22 19:43 260 查看
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5016

Very often, especially in programming contests, we treat a sequence of non-whitespace characters as a string. But sometimes, a string may contain whitespace characters or even be empty.
We can have such strings quoted and escaped to handle these cases. However, a different approach is putting the length of the string before it. As most strings are short in practice, it would be a waste of space to encode the length as a 64-bit unsigned integer
or add a extra separator between the length and the string. That's why a 7-bit encoded integer is introduced here.
To store the string length by 7-bit encoding, we should regard the length as a binary integer. It should be written out by seven bits at a time, starting with the seven least-significant
(i.e. 7 rightmost) bits. The highest (i.e. leftmost) bit of a byte indicates whether there are more bytes to be written after this one. If the integer fits in seven bits, it takes only one byte of space. If the integer does not fit in seven bits, the highest
bit is set to 1 on the first byte and written out. The integer is then shifted by seven bits and the next byte is written. This process is repeated until the entire integer has been written.
With the help of 7-bit encoded integer, we can store each string as a length-prefixed string by concatenating its 7-bit encoded length and its raw content (i.e. the original string).

Input

There are multiple test cases. The first line of input is an integer T indicating the number of test cases.
Each test case is simply a string in a single line with at most 3000000 characters.

Output

For each test case, output the corresponding length-prefixed string in uppercase hexadecimal. See sample for more details.

Sample Input

3
42
yukkuri shiteitte ne!!! https://en.wikipedia.org/wiki/Answer_to_Life,_the_Universe,_and_Everything#Answer_to_the_Ultimate_Question_of_Life.2C_the_Universe_and_Everything_.2842.29


Sample Output

023432
1779756B6B75726920736869746569747465206E65212121
9A0168747470733A2F2F656E2E77696B6970656469612E6F72672F77696B692F416E737765725F746F5F4C6966652C5F7468655F556E6976657273652C5F616E645F45766572797468696E6723416E737765725F74


题意:(题意不是很好懂)

给定一个字符串,用字符串的ASC2码的16进制数输出 ,并在前面输出字符串长度的16进制,

输出长度的规则是 :先输出长度的二进制数的后七位的十六进制

(如果左边还有1 则这在后七位前面加上个1再输出 然后二进制数右移动七位,直到左边没有1)

注:所有16数都必须为两位!

代码如下:

#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
char str[3000017];

int main()
{
	int t;
	int len,i;
	scanf("%d",&t);
	getchar();
	while(t--)
	{
		gets(str);
		len=strlen(str);
		if(len == 0)
		{
			printf("00\n");
			continue;
		}
		int len2=len;
		int fir=1;
		int yierqi=127;
		while(len)
		{
			int tem=(len&127); //取后七位
			if((len>>7))//如果左边还有1, 则这在后七位前面加上个1
			{
				tem|=128;
				fir=0;
			} 
			
			printf("%02X",tem);
			len>>=7; //右移七位
		}
		for(i = 0; i < len2; i++)
		{
			printf("%02X",str[i]);
		}
		printf("\n");
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: