alice132

 

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;
}

posted on 2026-01-22 21:48  alice_ss  阅读(1)  评论(0)    收藏  举报

导航