题解:P13437 [GCJ 2009 #1C] All Your Base
Iloveyou520 · · 题解
题目传送门
先上代码
#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)。 该实现通过哈希表记录字符对应数字,动态确定进制,确保计算结果为最小可能值。时间复杂度可以保证每个测试点都不会超时。