编码问题 题解

【问题描述】

编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。字母表中共有26个小写字母{a,b,c….,z}。这些特殊的单词长度不超过6且字母按照升序排列。把所有这样的单词放在一起,按字典顺序排列,一个单词的编码就对应着它在字典中的位置,例如:a-1;b-2;z-26;ab-27;ac-28;你的任务就是对于所给的单词,求出它的编码。

【解题思路】

设给定的字母长度为l,不难看出可以用组合数公式求出长度为l的第一个单词的编码,即Σ(C(26,i),1<=i<=l-1)+1,接着用搜索一个个去搜长度为l的编码,直到输入的单词为止。

【代码实现】

 1 var s:string;
 2     ans,i,l:longint;
 3     flag:boolean;
 4 function c(x,y:longint):longint;
 5 var t,i:longint;
 6 begin
 7  t:=1;
 8  for i:=1 to y do
 9   t:=t*(x-i+1)div i;
10 end;
11 procedure dfs(n:longint;st:string);
12 var j:longint;
13     i,ch:char;
14 begin
15  if n=l then
16   begin
17    inc(ans);
18    if st=s then
19     begin
20      flag:=true;
21      exit;
22     end;
23   end;
24  if n=0 then
25   ch:=‘a‘
26  else
27   ch:=succ(st[n]);
28  for i:=ch to ‘z‘ do
29   begin
30    dfs(n+1,st+i);
31    if flag then exit;
32   end;
33 end;
34 begin
35  readln(s);
36  for i:=1 to length(s)-1 do
37   ans:=ans+c(26,i);
38  dfs(0,‘‘);
39  writeln(ans);
40 end.

Code

请注意求组合数公式的方法!普通组合数公式会超范围,因此,这里用了自定义C函数,不理解的可以手推一下。(本人推了好久终于在老师的帮助下弄懂了……)。

【参考文献】

http://www.cnblogs.com/whitecloth/articles/2400584.html

时间: 2024-10-20 06:23:53

编码问题 题解的相关文章

BZOJ 1140 POI2009 KOD 编码 DFS

题目大意:给定一棵二进制编码树,保证每个节点要么有2个儿子,要么没有儿子,每个叶节点代表一个字符,求有多少字符满足即使前面被删掉一个前缀,只要这个字符的编码没有被破坏,就可以保证后面的编码都解读正确 先说下这个做法是可以被卡的-- 首先我们可以发现这样的字符满足[编码树上根节点+任意一个后缀+一些完整的子串+这个字符的转移都能到达一个叶节点] 然后打几个标记爆搜就行了-- 然而这样做的复杂度是∑sizei的,当二叉树很平衡的时候复杂度是O(nlogn),亲测可以卡到O(n2) 我觉得那个搜索可以

算法(第四版)C#题解&mdash;&mdash;1.3

写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 这一节内容可能会用到的库文件有 Generics,同样在 Github 上可以找到. 善用 Ctrl + F 查找题目. 习题&题解 1.3.1 题目 为 FixedCapacityStackOfStrings 添加一个方法 isFull(). 解答 首先是 FixedCapacityStackOfStrings 类,官方 JA

【题解】PAT团体程序设计天梯赛 - 模拟赛

由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可. 1 #include <cstdio> 2 3 long long abs(long long x) 4 { 5 return x < 0 ? -x : x; 6 } 7 8 long long gcd(long

ZUFE 1035 字符宽度编码

Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 117  Solved: 16[Submit][Status][Web Board] Description 你的任务是编写一个程序实现简单的字符宽度编码方法.规则如下:将任何2~9个相同字符的序列编码成2个字符:第1个字符是序列的长度,用数字字符2~9表示,第2个字符为这一串相同字符序列中的字符.超过9个相同字符构成的序列编码方法是先编码前面9个字符,然后再编码剩余的字符.将任何不包括连续相同字符的序

noip2016十连测题解

以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #include <string.h> #include <time.h> #include <stdlib.h> #include <string> #include <bitset> #include <vector> #include <

HDU1236 排名 题解

Problem Description 今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑 每题的分值,所以并不是最后的排名.给定录取分数线,请你写程序找出最后通过分数线的 考生,并将他们的成绩按降序打印. Input 测试输入包含若干场考试的信息.每场考试信息的第1行给出考生人数N ( 0 < N < 1000 ).考题数M ( 0 < M < = 10 ).分数线(正整数)G:第2行排序给出第1题至第M题的正整数分值:以下N行,每行给出一

二进制哈夫曼编码

现有一段文言文,要通过二进制哈夫曼编码进行压缩.假设这段文言文只由4个汉字“之”“乎”“者”“也”组成,它们出现的次数分别为700.600.300.200.那么,“也”字的编码长度是( ). 哈弗曼编码的原理需要你自己研究再看看其思想.本题解如图: 汉字    概率      编码 之:    700            00 乎:    600            011 者:    300            0101 也:    200            0100 (编码数如图这

python字符编码惯用法

本文总结在实际应用中遇到的python字符编码问题,制定一套编码相关的约定,避免编码上的错误. 在写猥琐宝典时需要总结soj上做过的题,准备在总结过程中顺便写一个soj上的题解.题解使用python可读,也就是python可以直接eval的格式,以便于处理.写题解老是copy soj上的题目id,title不是太方便,所以就准备自动生成一个空的题解,里面包含了我做过的题.然而直接从soj上只能拿到自己过了的题的id列表,缺乏其它信息.缺乏的信息可以抽象为soj数据库,其中包含了一个以id为主键的

“Wishare杯”南邮第八届大学生程序设计竞赛之现场决赛 题解报告

A.爆炸吧,现充 (红) 时间限制:1000ms           内存限制:65536K 题目描述: a协有部分脱团分子,日复一日,年复一年地进行秀恩爱虐狗行为,对其他成员持续造成着精神伤害.Kojimai君表示在异端分子长期惨无人道的精神攻击下,早早的患上了少年痴呆症.为了应对这一症状,不得不经常把日常琐事记录下来,时间一长整本笔记本都记完了,他现在好奇自己一共记下了多少字,已知笔记本共n页,每页m行,因为心理因素,他排斥偶数页号,所以只在奇数页号的页面写字,又因为痴呆他在奇数页的第i行都