题目描述
小爱为标点符号设计了一套编码系统,编码规则如下:
[
的编码为010
]
的编码为101
<
的编码为00
>
编码为11
+
的编码为011
-
编码为100
根据这套编码规则,任意长的标点符号序列可以编码成 01 序列,例如
++>[-<]
编码后变成了0110111101010000101
。可以确定的是,符合编码规则的 01 序列只能对应一种唯一的符号序列。给定一串符合编码规则 01 序列,请还原它对应的符号序列。
输入格式
- 若干 01 表示输入。
输出格式
- 若干个符号表示输出。
数据范围
设 𝑏 表示输入数据的长度,则
- 30%的数据,2≤𝑏≤10
- 60%6 的数据,2≤𝑏≤2000
- 100% 的数据,2≤𝑏≤300000
>>>>>>分割线>>>>>>>>>>>>>分割线>>>>>>>>>>>>>分割线>>>>>>>>>>>>>分割线>>>>>>>
思路
用map存储键值对
字符串
-
字符串的长度 a.size()
-
切割字符串 a.substr(start, len) ,从start开始切割len个长度
map和pair
类似于python的字典结构
-
头文件 include<map>
-
定义 map<int, string> m;
-
定义并赋值 map<int, string> m={{1,"Jim"},{2,"Joy"}};
-
取值 m[key]
-
pair只能存储一组key-value, map可以存储多组
程序
#include <bits/stdc++.h>
using namespace std;
map<string, char> m;
string s;
int main() {
m["010"] = '['; m["101"] = ']';
m["00"] = '<'; m["11"] = '>';
m["011"] = '+'; m["100"] = '-';
cin >> s;
int n = s.size();
for (int i = 0; i < n;) {
if (m[s.substr(i, 3)]) {
cout << m[s.substr(i, 3)];
i += 3;
}
else{
cout << m[s.substr(i, 2)];
i += 2;
}
}
return 0;
}