编码
题目描述
编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。
字母表中共有 26 26 26 个字母 a , b , c , ⋯ , z \mathtt{a,b,c,\cdots,z} a,b,c,⋯,z,这些特殊的单词长度不超过 6 6 6 且字母按升序排列。把所有这样的单词放在一起,按字典顺序排列,一个单词的编码就对应着它在字典中的位置。
例如:
- a → 1 \verb!a! \to 1 a→1;
- b → 2 \verb!b! \to 2 b→2;
- z → 26 \verb!z! \to 26 z→26;
- ab → 27 \verb!ab! \to 27 ab→27;
- ac → 28 \verb!ac! \to 28 ac→28。
你的任务就是对于所给的单词,求出它的编码。
输入格式
仅一行,被编码的单词。
输出格式
仅一行,对应的编码。如果单词不在字母表中,输出 0 0 0。
样例 #1
样例输入 #1
ab
样例输出 #1
27
思路
首先从输入中读取需要编码的单词,并获取其长度。然后,初始化一个字符为’a’到’z’的循环,对每一个字符,都生成一个只包含该字符的字符串,然后以该字符串为起始,进行深度优先搜索(DFS)。
在进行DFS时,首先检查当前字符串的长度,如果长度超过了输入单词的长度,就返回,不再继续搜索。否则,从当前字符串的最后一个字符的下一个字符开始,生成新的字符串并进行DFS。然后将生成的字符串插入到对应长度的集合中。
在DFS结束后,从长度为1的集合开始,依次遍历每个集合中的字符串,同时维护一个计数器。当遍历到的字符串等于输入的单词时,输出计数器的值并结束程序。如果遍历完所有集合都没有找到输入的单词,就输出0。
注意
如果单词不在字母表中,输出 0 0 0。
AC代码
#include <algorithm>
#include <cstring>
#include <iostream>
#include <set>
#include <string>
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;ll len;
string s;
set<string> s1[10];void dfs(string x) {int l = x.length();if (l > len) {return;}for (char i = x.back() + 1; i <= 'z'; i++) {dfs(x + i);}s1[l].insert(x);// cout << x << "\n";
}int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> s;len = s.length();for (char i = 'a'; i <= 'z'; i++) {string t;t += i;dfs(t);}// cout << s1.size() << endl;ll ans = 0;for (int i = 1; i <= len; i++) {for (const auto j : s1[i]) {ans++;// cout << j << "\n";if (j == s) {cout << ans << "\n";return 0;}}}// 如果单词不在字母表中,输出 0。cout << 0 << "\n";return 0;
}