一、基本信息
Day:9.1
题目:CSP202509C HTTP 头信息
写码前保证分:40 分
写码前目标分:40 分
二、写码前规格压缩卡

三、写码前取分判断
本题主要需要处理 HPACK 的三种指令:
表格引用指令;
字面量并索引指令;
字面量不索引指令。
题目的子任务中:对于 40% 的数据,仅包含表格引用指令和字面量不索引指令,并且不包含 Huffman 编码字符串。
因此我决定第一版直接完成前 40% 的情况。
当前版本主要实现:
- 读取静态表中的键值对;
- 处理表格引用指令 1 i;
- 处理字面量不索引指令 3 0 k v;
- 处理字面量不索引指令 3 i v;
- 对普通字符串进行基本处理;
- 如果字符串以 HH 开头,则去掉最前面的一个 H。
因此写码前保证分定为 40 分。
四、完成的代码
cpp
#include <iostream>
#include <map>
#include <string>
using namespace std;
using ll = long long;
int main(){
int s,d;
cin>>s>>d;
map<int,pair<string,string> > mp;
for(int i=1;i<=s;i++){
string s1,s2;
cin>>s1>>s2;
mp[i]={s1,s2};
}
string H;
cin>>H;
int n;
cin>>n;
while(n--){
int op;
cin>>op;
if(op==1){
int a;
cin>>a;
cout<<mp[a].first<<" "<<mp[a].second<<endl;
}else if(op==3){
int a;
cin>>a;
if(a==0){
string k,v;
cin>>k>>v;
string s3=k,s4=v;
if(k[0]=='H'&&k[1]=='H'){
s3=k.substr(1);
}
if(v[0]=='H'&&v[1]=='H'){
s4=v.substr(1);
}
cout<<s3<<": "<<s4<<endl;
}else{
string s1=mp[a].first;
string v;
cin>>v;
string s3=s1,s4=v;
if(s1[0]=='H'&&s1[1]=='H'){
s3=s1.substr(1);
}
if(v[0]=='H'&&v[1]=='H'){
s4=v.substr(1);
}
cout<<s3<<": "<<s4<<endl;
}
}
}
return 0;
}
五、主要卡点
1.开始容易把三种指令混在一起,题目中有三种指令:
1 i
2 0 k v / 2 i v
3 0 k v / 3 i v
一开始看起来比较像,后面先把它们分开以后思路清楚很多。当前 40 分版本只需要处理:1 3 所以我先不碰 2 指令和动态表。
- 指令中又分成两种情况,字面量不索引指令有:
3 0 k v和:3 i v
如果编号是 0,字段名需要直接从输入中读取;如果编号不是 0,字段名需要从表格中根据编号取得。因此代码中需要分情况处理。
3.又需要记录编号,又要记字段名和字段值,善用map和pair会好写很多
4.对于开头双H的处理只在op3时进行处理,op1时不需要(还是要仔细读题)。