标签:
编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。字母表中共有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.
关于组合数的求法,因为阶乘会超出数据范围,所以借用一个技巧。
http://www.cnblogs.com/whitecloth/archive/2012/03/16/2400584.html
标签:
原文地址:http://www.cnblogs.com/Herrwerner/p/4481096.html