编码问题 题解

来源:互联网 发布:西安高新广电网络 编辑:程序博客网 时间:2024/06/06 13:20
【问题描述】

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

【样例输入】

  ab

【样例输出】

  27

【解题思路】

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

【代码实现】

编码
var s:string;    ans,i,l:longint;    flag:boolean;function c(x,y:longint):longint;var t,i:longint;begin c:=1; for i:=1 to y do  c:=c*(x-i+1)div i;end;procedure dfs(n:longint;st:string);var j:longint;    i,ch:char;begin if n=l then  begin   inc(ans);   if st=s then    begin     flag:=true;     exit;    end;  end; if n=0 then  ch:='a' else  ch:=succ(st[n]); for i:=ch to 'z' do  begin   dfs(n+1,st+i);   if flag then exit;  end;end;begin readln(s); l:=length(s); for i:=1 to l-1 do  ans:=ans+c(26,i); dfs(0,''); writeln(ans);end.

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

【参考文献】

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

0 0
原创粉丝点击