2025.12.20 作业 - # P1246 编码
题目描述
编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。
字母表中共有 \(26\) 个字母 \(\mathtt{a,b,c,\cdots,z}\),这些特殊的单词长度不超过 \(6\) 且字母按升序排列。把所有这样的单词放在一起,按字典顺序排列,一个单词的编码就对应着它在字典中的位置。
例如:
- \(\verb!a! \to 1\);
- \(\verb!b! \to 2\);
- \(\verb!z! \to 26\);
- \(\verb!ab! \to 27\);
- \(\verb!ac! \to 28\)。
你的任务就是对于所给的单词,求出它的编码。
输入格式
仅一行,被编码的单词。
输出格式
仅一行,对应的编码。如果单词不在字母表中,输出 \(0\)。
输入输出样例 #1
输入 #1
ab
输出 #1
27
#include <iostream>
using namespace std;
string s;
int c[28][28];
int n;
int main() {
cin>>s;
for (int i=0;i<s.size()-1;i++)
if (s[i]>=s[i+1]) {
cout<<0<<endl;
return 0;
}
for (int i=0;i<=26;i++) c[i][0]=c[i][i]=1;
for (int i=1;i<=26;i++)
for (int j=1;j<=i-1;j++)
c[i][j]=c[i-1][j]+c[i-1][j-1];
n=s.length();
long long Ans=0;
for (int i=1;i<=n-1;i++) Ans+=c[26][i];
int w1=0;
for (int i=0;i<n;i++) {
int w2=s[i]-'a'+1; //字符表的编号,a---1,b---2
for (int k=w1+1;k<w2;k++) Ans+=c[26-k][n-1-i];
w1=w2;
}
cout<<Ans+1<<endl;
return 0;
}
浙公网安备 33010602011771号