编码问题

题意就是a,b,c.....ab.....编码,给你一个字符串,输出这是第几个;

这里可以用暴力枚举,但也可以用组合数学的高超知识;

既然这样我就说一下排列组合的方法,如果要弄一个 各位数字递增的三位数,只需要在一个有序数列里面取三个数字,此时就无需关注顺序,因为顺序只能是升序的。比如0 1 2 3 4 5 6 7 8 9。取得9 5 8 那么他的顺序就只能是589。总数就是C(x,y),x代表位数,y代表可供选择的数的长度,

就像例子中是c(3,10)。对于字母排列,道理也是一样。只需要注意一下y的大小,然后从左到右一步一步推下去就好。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string> using namespace std;
int f[][];
int d[];
string str; int main(){
ios::sync_with_stdio();
cin.tie();
cout.tie();
cin>>str;
f[][] = ;
for(int i=;i<=;i++) //用打表的方式做组合C的计算
{
for(int j=;j<=;j++)
f[i][j] = f[i-][j-] + f[i-][j];
}
int l = str.length();
for(int i=; i<l; i++)
{
d[i] = str[i] -'a' + ;
if(i> && d[i]<=d[i-]){cout<<<<endl;return ;} //特判不存在的情况
}
if(l==){cout<<<<endl;return ;}
if(l==){cout<<d[]<<endl;return ;}
//累加长度小于L的可能性;
int sum = ;
for(int i=; i<l; i++)
{
sum+= f[][i];//i 代表数的位数;
}
//下面是求l位数的前面; 如:BDF 先计数A*的个数 再BC*的个数 再BD
for(int i=;i<l-;i++)
{
if(i==)
{
for(int j=; j<d[i]; j++)
{
sum+=f[-j][l-i-];
//cout<<f[26-j][l-i-1]<<endl;
}
}
else
{
for(int j=d[i-]+; j<d[i]; j++) //一开始这个j的界限想了比较久,后来想明白了,确实和前一个有关系,
{ //因为规定后一个数比前一个数大;所以后一个数是从前个数+1开始;
sum+=f[-j][l-i-];
}
}
}
sum+=d[l-]-d[l-]; //比如BDE到BDF有2个,这个需要加上去。
cout<<sum<<endl;
return ;
}

洛谷P1246编码问题-排列组合,分类讨论的更多相关文章

  1. 题解【洛谷 P1246 编码】

    题目 编码工作常被运用于密文或压缩传输.这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数宇. 字母表中共有 \(26\) 个字母 \(\{\tt a,b,\cdots,z\}\),这些 ...

  2. 洛谷P3979 遥远的国度 树链剖分+分类讨论

    题意:给出一棵树,这棵树每个点有权值,然后有3种操作.操作一:修改树根为rt,操作二:修改u到v路径上点权值为w,操作三:询问以rt为根x子树的最小权值. 解法:如果没有修改树根操作那么这题就是树链剖 ...

  3. 洛谷 P7156 - [USACO20DEC] Cowmistry P(分类讨论+trie 树上 dp)

    题面传送门 题意: 给出集合 \(S=[l_1,r_1]\cup[l_2,r_2]\cup[l_3,r_3]\cup\dots\cup[l_n,r_n]\) 和整数 \(k\),求有多少个三元组 \( ...

  4. 二叉树的遍历 &【NOIP2001普及组】& 洛谷 P1030 求先序排列

    题目链接 https://www.luogu.org/problemnew/show/P1030 模板题 先讲一下二叉树的遍历 二叉树的遍历 分类 性质 求法 分为三类: 先序遍历(PreOrder) ...

  5. 洛谷 P1030 求先序排列 Label:None

    题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序 ...

  6. 洛谷P1030求先序排列

    题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度≤8. 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列. 输 ...

  7. 数学【洛谷P4071】 [SDOI2016]排列计数

    P4071 [SDOI2016]排列计数 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列 ...

  8. 洛谷 P1030 求先序排列

    题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序 ...

  9. 洛谷——P1030 求先序排列

    https://www.luogu.org/problem/show?pid=1030#sub 题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度< ...

随机推荐

  1. [系列] Go - chan 通道

    目录 概述 声明 chan 写入 chan 读取 chan 关闭 chan 示例 推荐阅读 概述 原来分享基础语法的时候,还未分享过 chan 通道,这次把它补上. chan 可以理解为队列,遵循先进 ...

  2. Code blocks返回错误代码:Process returned -1073741819 (0xC0000005)

    循环语句访问链表时,返回了错误代码: 逐项排查后,发现是由while循环引起的: 附上出错代码: do{ L=L->post; printf("%05d %d %05d\n" ...

  3. hexo的环境变量被删除怎么办

    这篇文章主要讲在path这一环境变量被删除的情况下,补上哪些环境变量才可以使hexo重新使用. 前两天配置opencv的时候,不小心将环境变量中"path"这一项中的内容给覆盖掉了 ...

  4. java基础学习_io流之FileInputStream

    一.FileInputStream属性: /* File Descriptor - handle to the open file */private final FileDescriptor fd; ...

  5. [NUnit]No results

    Results (nunit3) saved as TestResult.xmlCommitting...No results, this could be for a number of reaso ...

  6. print('', end='')

    print函数的end参数,从python3才开始支持,所以如果要使用这种模式,需要对应使用python3

  7. 第五章-处理多窗口 | Electron实战

    本章主要内容: 使用JavaScript Set数据结构跟踪多个窗口 促进主进程和多个渲染器进程之间的通信 使用Node APIs检查应用程序运行在那个平台上 现在,当Fire Sale启动时,它为U ...

  8. Netty学习(四)-TCP粘包和拆包

    我们都知道TCP是基于字节流的传输协议.那么数据在通信层传播其实就像河水一样并没有明显的分界线,而数据具体表示什么意思什么地方有句号什么地方有分号这个对于TCP底层来说并不清楚.应用层向TCP层发送用 ...

  9. io流处理文件夹复制功能(java代码)

    拷贝某个目录下得所有文件拷指定位置 思想归纳 首先我们需要做的先获取到资源文件夹路径,这里我们先在程序中写死,然后我们还需要一个目标文件夹就是你需要拷贝到哪里.有了这两个文件夹我就可以进行复制了 然后 ...

  10. koa2+vue实现登陆以及是否登陆控制

    这里我们先说说登陆以及登陆状态控制需要的插件jsonwebtoken,jsonwebtoken就可以实现token的生成与反向解密出用户数据.安装步骤: npm install jsonwebtoke ...