編碼問題 題解,編碼題解
【問題描述】
編碼工作常被運用於密文或壓縮傳輸。這裡我們用一種最簡單的編碼方式進行編碼:把一些有規律的單詞編成數字。字母表中共有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