首页 > 其他分享 >洛谷P1246 编码(运用组合数学解决问题)

洛谷P1246 编码(运用组合数学解决问题)

时间:2025-01-18 22:32:26浏览次数:3  
标签:编码 洛谷 P1246 int 字母 len 单词 str

传送门:编码 - 洛谷

题目描述

编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。

字母表中共有 2626 个字母 a,b,c,⋯ ,za,b,c,⋯,z,这些特殊的单词长度不超过 66 且字母按升序排列。把所有这样的单词放在一起,按字典顺序排列,一个单词的编码就对应着它在字典中的位置。

例如:

  • a→1;
  • b→2;
  • z→26;
  • ab→27;
  • ac→28。

你的任务就是对于所给的单词,求出它的编码。

输入格式

仅一行,被编码的单词。

输出格式

仅一行,对应的编码。如果单词不在字母表中,输出 00。

输入输出样例

输入 #1复制

ab

输出 #1复制

27

思路分析:

题目说了,这个单词最长也就6个字母,并且单词是按照升序排序的。那么其实我们可以先不用管排列的问题,我们只需要考虑每种情况会有多少种组合就行了,因为每种字母组合就只有一种排列的结果(那就是升序排序,如:{ a , b }这个字母组合只有ab这样一种排列可能)。

易知,由3个字母组合而成的字母在字母表中的顺序肯定比由1或2个字母组合而成的单词的要后面,所以我们可以先计算长度为1~len-1的单词数目。

统计对同样长度为len但是小于题目所给单词的单词数目:

例如如果我们已经确定了第一位的字母是‘a’,那么我们就要从25位字母中选取len-1个字母。类似的,如果我们已经确定了第i个位置的字母j,那么我们就要从'z'-j个字母中选取len-i-1个(因为字符串是从第0位开始计算的,所以i就是从0开始增长的)。

ACcode:

#include<bits/stdc++.h>
using namespace std;
#define int long long
string str;

int solve(int n, int m) {//组合数
    if (!m) return 1;
    int t = 1;
    for (int i = n; i > n - m; i--) {
        t *= i;
    }
    for (int i = 1; i <= m; i++) {
        t /= i;
    }

    return t;
}

signed main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

    cin >> str;
    int ans = 0, len = str.size();

    for (int i = 1; i < len; i++) {
        if (str[i] <= str[i - 1]) {//判断单词是否在字母表中
            cout << 0;
            exit(0);
        }
    }
    
    //计算出位数比str小的单词数
    for (int i = 1; i < len; i++) {
        ans += solve(26, i);
        //从26位字母中选取i个字母组合成一个单词
        /*注意:我们只是选取字母,并未对字母进行排序,而依照题目要求我们知道对于每种选取结果
        只有一种可能,那就是按照升序排列*/
    }

    for (int i = 0; i < len; i++) {
        for (char j = (i == 0 ? 'a' : str[i - 1] + 1); j < str[i]; j++) {
            ans += solve('z' - j, len - i - 1);
            //'z'-j:ASCII码大于j的字母个数
            //len-i-1:str中第i个字母后的剩余字母数目
        }
    }

    //ans是小于str的单词数目之和,所以要再自增一位,str是第ans+1个单词
    cout << ++ans;

    return 0;
}


附录:本文借鉴了洛谷的Alex_Wei大佬的题解,大家可以移步洛谷查看原文

标签:编码,洛谷,P1246,int,字母,len,单词,str
From: https://blog.csdn.net/2301_79772108/article/details/145233467

相关文章

  • Python 潮流周刊#86:Jupyter Notebook 智能编码助手(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。分享了12篇文章,12个开源项目,全文2000字。以下是本期摘要:......
  • 洛谷 P11388 [COCI 2024/2025 #1] 飞跃 / Skokovi
    #[COCI2024/2025#1]飞跃/Skokovi##题目背景译自[COCI2024/2025#1](https://hsin.hr/coci/)T2。$\texttt{5s,0.5G}$。满分为$75$。##题目描述有$n$朵花,此外有一个正整数$k$。第$i$朵花的高度为$a_i$。一开始,Filip在第$1$朵花上。当她在第$i$朵花......
  • 【最大生成树】洛谷P2700 逐个击破
    P2700逐个击破#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;typedeflonglongLL;constintN=2e5+10,M=N;intn,k;LLres,sum;boolst[N];intp[N];structEdge{ inta,b,w; booloperator......
  • 【搜索】洛谷P1123 取数游戏
    P1123取数游戏搜索顺序:按格子枚举。思想类比AcWing843.n-皇后问题按格子枚举方法,以及AcWing1116.马走日AcWing1117.单词接龙AcWing1118.分成互质组,体会恢复现场写在for循环内部与写在for循环外部的区别。最大的区别:恢复现场写在for循环外可以不用清空标记数组。......
  • 【洛谷P1303】高精度乘法
    A*BProblem题目背景高精度乘法模板题。题目描述给出两个非负整数,求它们的乘积。输入格式输入共两行,每行一个非负整数。输出格式输出一个非负整数表示乘积。样例#1样例输入#112样例输出#12提示每个非负整数不超过10^{2000}。入坑OI这么久发现还没有写过......
  • 【洛谷训练记录】【LGR-213-Div.4】洛谷入门赛 #31
    训练情况赛后反思模拟题差点红温,差一道字符串模拟题AKA题问一个数\(a\)加多少后的个位数变成\(b\),取出\(a\)的个位数,再用\(b\)去减,如果小于零答案再加十。#include<bits/stdc++.h>//#defineintlonglong#defineendl'\n'usingnamespacestd;voidsolve()......
  • 命令行终端的编码
    编码设置查看当前系统的编码,可以通过cmd命令行终端,运行chcp命令查看常见的有以下几种(GBK通常是中文系统的默认编码)936GBK437美国英语65001utf-8对于中文系统来说,GBK经常会导致一些终端窗口的乱码问题,可以设置全局的编码为65001打开注册表路径HKEY_LOCAL......
  • 洛谷P1803
    凌乱的yyy/线段覆盖-洛谷代码区:#include<stdio.h>#include<stdlib.h>structGAME{ intstart; intend;};intcmp(constvoid*a,constvoid*b){ structGAME*game1=(structGAME*)a; structGAME*game2=(structGAME*)b; returngame1->end-game2->......
  • C# 获取excel某列单元值的特殊数值处理方式(根据单元数据格式编码获取小位数)
    当excel文件某列单元数值显示的值和实际的值不一致:1.某列某单元显示:38,实际值是38.43,只取显示的38的值。2.某列某单元显示:38.68,实际值是38.685,只取显示的38.68的值。注释:如果没有格式并且不是默认的常规格式,是文本格式时,读取什么值则返回什么值。以下是本人写的公共静态帮助类,可以......
  • 洛谷题单指南-线段树的进阶用法-P3168 [CQOI2015] 任务查询系统
    原题链接:https://www.luogu.com.cn/problem/P3168题意解读:一个任务管理系统,能够查询在某个时间点运行的任务中优先级最小的k个任务的优先级之和。解题思路:由于总时间n不超过100000,考虑针对所有时刻建立可持久化线段树,根节点为root[i]的线段树维护时刻i的任务情况,节点区间表示......