编码
题目描述
编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。
字母表中共有 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
问题链接: P1246 编码
问题分析: 数学问题,不解释。
参考链接: (略)
题记: (略)
AC的C++语言程序如下:
/* P1246 编码 */
#include <iostream>
using namespace std;
typedef long long LL;
// 组合函数
LL C(int n, int m)
{
LL p = 1;
for (int i = 1; i <= m; i++)
p *= n - m + i, p /= i;
return p;
}
int main()
{
string s;
cin >> s;
for (int i = 1; s[i]; i++)
if (s[i] <= s[i - 1]) {
cout << '0';
return 0;
}
LL ans = 0;
for (int i = 1; i < s.length(); i++)
ans += C(26, i);
for (int i = 0; s[i]; i++) {
char a = 'a';
if (i > 0) a = s[i - 1] + 1;
for (char c = a; c < s[i]; c++)
ans += C('z' - c, s.length() - i - 1);
}
cout << ++ans;
return 0;
}