第一题:T1符号译码
标签:字符串、枚举模拟、
m
a
p
map
map
题意:给定
01
01
01串和字符之间的编码规则,给出一个
01
01
01字符串,要求输出对应的符号序列。
(字符串长度为
n
n
n,
2
≤
n
≤
300000
2≤n≤300000
2≤n≤300000)
题解:按照题意直接暴力模拟就好了,可以用
m
a
p
map
map优化下代码逻辑。下面给出两种的写法的代码。
代码:
普通暴力版:
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int n = s.size();
for (int i = 0; i < n; i++) {
if (s[i] == '0' && s[i+1] == '1' && s[i+2] == '0') {
cout << '[';
i += 2;
}
else if (s[i] == '1' && s[i+1] == '0' && s[i+2] == '1') {
cout << ']';
i += 2;
}
else if (s[i] == '0' && s[i+1] == '0') {
cout << '<';
i += 1;
}
else if (s[i] == '1' && s[i+1] == '1') {
cout << '>';
i += 1;
}
else if (s[i] == '0' && s[i+1] == '1' && s[i+2] == '1') {
cout << '+';
i += 2;
}
else if (s[i] == '1' && s[i+1] == '0' && s[i+2] == '0') {
cout << '-';
i += 2;
}
}
return 0;
}
简洁版、 m a p map map优化版:
#include <bits/stdc++.h>
using namespace std;
map<string, char> m;
int main() {
// map预记录
m["010"] = '['; m["101"] = ']';
m["00"] = '<'; m["11"] = '>';
m["011"] = '+'; m["100"] = '-';
string s;
cin >> s;
int n = s.size();
for (int i = 0; i < n; i++) {
if (m[s.substr(i, 3)]) {
cout << m[s.substr(i, 3)];
i += 2;
}
else if (m[s.substr(i, 2)]) {
cout << m[s.substr(i, 2)];
i += 1;
}
}
return 0;
}