专栏文章

题解:P13437 [GCJ 2009 #1C] All Your Base

P13437题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioqznne
此快照首次捕获于
2025/12/02 23:43
3 个月前
此快照最后确认于
2025/12/02 23:43
3 个月前
查看原文

题目传送门

先上代码

CPP
#include <bits/stdc++.h>//禁止复制,你我同行,共创美好洛谷
using namespace std;
#define libaitian return
#define fangshaojin99 0
long long solve(const string &s) {
    unordered_map<char, int> char_to_digit;
    int base = 0;
    for (char c : s) {//禁止复制,你我同行,共创美好洛谷
        if (char_to_digit.find(c) == char_to_digit.end()) {
            if (base == 0) {
                char_to_digit[c] = 1;
            } else if (base == 1) {//禁止复制,你我同行,共创美好洛谷
                char_to_digit[c] = 0;
            } else {
                char_to_digit[c] = base;
            }
            base++;//禁止复制,你我同行,共创美好洛谷
        }
    }
    if (base == 1) base = 2;
    long long result = 0;
    for (char c : s) {//禁止复制,你我同行,共创美好洛谷
        result = result * base + char_to_digit[c];
    }
//你复制,你好意思吗,你看看做法就好了,还想着偷别人的代码!简直是无耻!
    libaitian result;
}
int main() {
    int T;//禁止复制,你我同行,共创美好洛谷
    cin >> T;
    for (int i = 1; i <= T; ++i) {
        string s;
        cin >> s;//禁止复制,你我同行,共创美好洛谷
        cout << "Case #" << i << ": " << solve(s) << endl;
    }
    libaitian fangshaojin99;//本磕瑾天(虽然很小众)
}

通关记录

-------------------------------------------------华丽的分割线------------------------------------------------

算法说明:

‌数字分配原则‌:

首位字符赋值为1(不能为0) 次位字符赋值为02 后续字符按出现顺序递增赋值(如2,3,...)

‌进制选择‌:

最小可能进制等于不同字符数(至少为2[你见过一进制吗(质问)]) 例如"cats"有4个不同字符,使用4进制 ‌

特殊处理‌:

单一字符时一定要

强制使用二进制

这样才能保证在十进制下最小(如"aaa"→1×2²+1×2+1=7)。 该实现通过哈希表记录字符对应数字,动态确定进制,确保计算结果为最小可能值。时间复杂度可以保证每个测试点都不会超时。

Ctrl+C,Ctrl+V当然好用

所以

本贴禁止复制,不然就进去呆着吧

你我同行,共创美好洛谷

看懂了咕一声(没别的意思[无辜])

评论

0 条评论,欢迎与作者交流。

正在加载评论...