1. 程式人生 > >CDUTCM OJ 1598: 進階的01串

CDUTCM OJ 1598: 進階的01串

題目描述

計算機中的檔案都是由一串01串組成的,我們可以通過某種方式壓縮它。

我們可以用一個十進位制數串(長度不超過1000),代表一個長度不超過8000的01串。例如十進位制串15  1  128代表01串00001111  00000001  10000000。01串可以劃分成連續的片段(即連續成段的0或1),如上例可劃分成0000  1111 0000000  11  0000000五個片斷。我們可以用一個位元組(8位)的二進位制表示一個片斷,表示方法為:位元組的最高位代表此片段的顏色是0還是1,低7位代表此片段的長度,所以上例就可以表示為:00000100  10000100  00000111  10000010  00000111。注意到現在有5個位元組,每個位元組可以用一個不超過255的十進位制數表示,所以我們又可以把它表示成4  132  7  130  7。

我們再看看整個編碼壓縮過程:

15         1        128

00001111  00000001  10000000

0000      1111     0000000     11      0000000

00000100  10000100  00000111  10000010   00000111

   4        132         7        130        7

可以保證所有輸入資料連續的0或1片段的長度均小於128。

輸入

輸入資料只有一行,第一個數N是一個可被8整除的不大於8000的自然數,代表編碼的01串長度。接下來N/8個十進位制整數。

輸出

輸出只有一行,輸出最後的十進位制壓縮編碼。

樣例輸入

24 15 1 128

樣例輸出

4 132 7 130 7

按照題意處理即可:

AC程式碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

#include<iostream>

#include<string>

#include<cstring>

#include<algorithm>

#include<cmath>

using namespace std;

int main()

{

int n,a[4001],cut,sum,t[4001],rp,oo;

string c,q,b;

while(cin>>n)

{

string c,q,b;

for(int i=0;i<n/8;i++)

{

cin>>a[i];

string q;

do

{

q+=a[i]%2+'0';

a[i]=a[i]/2;

}while(a[i]>0);

reverse(q.begin(),q.end());

for(int j=8;j>q.length();j--)

{

c+='0';

}

c+=q;

}

//cout<<c<<endl;

//string b;

for(int i=0;i<c.length();i++)

{

string q;

cut=1;

b+=c[i];

//cout<<b<<endl;

while(c[i]==c[i+1])

{

cut++;

i++;

}

//cout<<cut<<endl;

do

{

q+=cut%2+'0';

cut=cut/2;

}while(cut>0);

reverse(q.begin(),q.end());

//cout<<q.length()<<endl;

for(int j=7;j>q.length();j--)

{

b+='0';

}

b+=q;

}

//cout<<b<<endl;

for(int i=0,j=0;i<b.length();i+=8,j++)

{

rp=0;

for(int m=i;m<i+8;m++)

{

rp+=pow(2,7-m%8)*(b[m]-'0');

}

t[j]=rp;

oo=j;

}

//cout<<oo<<endl;

for(int i=0;i<=oo;i++)

{

printf("%d%c",t[i],i<oo?' ':'\n');

}

}

return 0;

}

/**************************************************************

Problem: 1598

User: 201644901023

Language: C++

Result: 正確

Time:0 ms

Memory:2208 kb

****************************************************************/