编码问题 题解
【问题描述】
编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。字母表中共有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函数,不理解的可以手推一下。(本人推了好久终于在老师的帮助下弄懂了……)。