【问题描述】
编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。字母表中共有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