第五届上海市青少年算法竞赛 T1 符号译码(字符串、枚举模拟、map)

第一题:T1符号译码

标签:字符串、枚举模拟、 m a p map map
题意:给定 01 01 01串和字符之间的编码规则,给出一个 01 01 01字符串,要求输出对应的符号序列。
(字符串长度为 n n n 2 ≤ n ≤ 300000 2≤n≤300000 2n300000
题解:按照题意直接暴力模拟就好了,可以用 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值