编码问题

问题描述:

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

解题思路:

单词按字典排序,就不会出现相同字母,所以每一个字母长度(L)中编码最小的字母就是abcdef......于是就可以先用Σ(26,i)(1<=i<=L-1)求最小编码。然后去在最小字母往后搜,直到搜到

原字母,编码数也就出来了。

代码实现

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

关于组合数的求法,因为阶乘会超出数据范围,所以借用一个技巧。

参考文献

http://www.cnblogs.com/whitecloth/archive/2012/03/16/2400584.html

 

posted @ 2015-05-06 10:09  Herrwerner  阅读(218)  评论(0编辑  收藏  举报