题目解读
其实就是模拟,不需要任何算法。。。能把题目写出来也就过了。
出去用字符串存储之外,运算过程中也要善用位运算哦,也就是<<、>>。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string press, res;
int n;
string bi[16] = {"0000", "0001", "0010", "0011",
"0100", "0101", "0110", "0111",
"1000", "1001", "1010", "1011",
"1100", "1101", "1110", "1111"};
int c[100], c_index;
string byte2str(string x)
{
string res = "";
int t1, t2;
t1 = (x[0] <= 'z' && x[0] >= 'a') ? x[0] - 'a' + 10 : x[0] - '0';
t2 = (x[1] <= 'z' && x[1] >= 'a') ? x[1] - 'a' + 10 : x[1] - '0';
res += bi[t1];
res += bi[t2];
return res;
}
int byte2num(string x)
{
int res = 0;
for(auto k : x)
{
int t = (k <= 'z' && k >= 'a') ? k - 'a' + 10 : k - '0';
res = (res << 4) | t;
}
return res;
}
int bit2num(string x)
{
int res = 0;
for(auto k : x)
{
res = (res << 1) | (k - '0');
}
return res;
}
void print()
{
int len = res.size();
for(int i = 0; i * 8 * 2 < len; i ++)
cout << res.substr(i * 16, 16) << '\n';
}
int main()
{
cin >> n;
string t;
for(int i = 0; i * 8 < n; i ++)
{
cin >> t;
press += t;
}
// cout << press;
int index = 0;
// length: c_i
while(1)
{
string byte;
byte += press[index * 2];
byte += press[index * 2 + 1];
index ++;
string bit = byte2str(byte);
c[c_index ++] = byte2num(byte) - (1 << 7);
if(bit[0] == '0'){
c[c_index - 1] += (1 << 7);
break;
}
}
// for(int i = 0; i < c_index; ++i){
// cout << c[i] << ' ';
// }
// puts("");
int dbg = 0;
// next
while(index < n){
string byte;
byte += press[index * 2];
byte += press[index * 2 + 1];
string bit = byte2str(byte);
// cout << bit << ' ' << byte2num(byte) << ' ' << bit2num(bit) <<'\n';
if(bit[6] == '0' && bit[7] == '0' && dbg < 2)
{
index ++;
int l = (bit2num(bit) >> 2) + 1;
if(l <= 60)
{
res += press.substr(index * 2, l * 2);
index += l;
}
else
{
int t = 0;
for(int j = 0; j < l - 60; ++ j)
{
byte = "";
byte += press[index * 2];
byte += press[index * 2 + 1];
t += (byte2num(byte) << (j * 8));
index ++;
}
t = t + 1;
res += press.substr(index * 2, t * 2);
index += t;
}
// cout << res << '\n';
}
else if(bit[6] == '0' && bit[7] == '1')
{
index ++;
int l = bit2num(bit.substr(3, 3)) + 4;
int o = bit2num(bit.substr(0, 3)) << 8;
byte = "";
byte += press[index * 2];
byte += press[index * 2 + 1];
index ++;
o += byte2num(byte);
// printf("%d %d\n", o, l);
int len = res.size();
string cp = "";
if(o >= l)
{
cp = res.substr(len - o*2, l*2);
res += cp;
}
else
{
cp = res.substr(len - o*2);
while(cp.size() < l * 2)
cp += cp;
res += cp.substr(0, l * 2);
}
}
else if(bit[6] == '1' && bit[7] == '0')
{
index ++;
int l = bit2num(bit.substr(0, 6)) + 1;
int o = 0;
for(int j = 0; j < 2; ++ j)
{
byte = "";
byte += press[index * 2];
byte += press[index * 2 + 1];
o += (byte2num(byte) << (j * 8));
index ++;
}
int len = res.size();
// printf("%d %d %d\n", o, l, len);
string cp = "";
if(o >= l)
{
cp = res.substr(len - o*2, l*2);
res += cp;
}
else
{
cp = res.substr(len - o*2);
while(cp.size() < l * 2)
cp += cp;
res += cp.substr(0, l * 2);
}
}
else
index ++;
}
print();
return 0;
}