POJ 1850 code 組合數學

2021-07-26 14:43:05 字數 1213 閱讀 4842

poj 1850 code

將字母和單詞(全部小寫並且按照字典序遞增)按照字典序編號,比如

a-1

b-2

… z-26

ab-27

… az-51

… 給你乙個字母或單詞,問你它的編號

以樹狀的結構來分析這道題會比較直觀。

按照樹的節點依次編號,每個字母或單詞就落在乙個節點上。要求乙個單詞的編號,比較直接的想法是分別求出該 單詞上一層的最大編號和該單詞在當前層中所處的位置。(根節點為第0層)

下面分別進行討論

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int inf=999999999;

#define ll long long int

char s[11];//輸入

int bj[30];//標記之前某個字母是否被訪問過

ll f[27][11];//f[i][j]表示對於根節點有i個分支第j層的節點數, 根節點是第0層

ll a[11];

int find_loc(char c0,char c,int bj)//在某些字母被標記的情況下詢問字母c處於字母樹中的第幾個分支,c0是前乙個字母

}}void get_a()

}void get_f()

}}bool check(char s)

void work()

int loc;

ll node=26;//儲存當前的節點的父親的分支數

for(int i=1;i<=lenth-1;i++)ans+=f[26][i];//求上一層的最大編號

//cout<

else loc=find_loc(s[i-1],s[i],bj);

bj[(int)s[i]-96]=1;

for(int j=1;j1];

node=node-loc;//更新node

}ans+=1;

cout

}

POJ 1850 Code 組合數學)

題意 求str在字典中的編號。字典中的字串都是嚴格公升序排列,而且長度遞增的。a z為1 26,然後是ab az 分別編號為27 51,然後是bc bz。分析 1 首先可以確定長度比str小的總共有多少個。比如長度為2的就有c 26,2 個,相當於26個字元中選2個,由於預設是公升序排列,不會重複,...

組合數學 POJ 1850 Code

poj 1850 比如說求比358小的由1 9的數字組成的數 0不算 而且要求後面乙個數一定比前乙個數大,而且數字不能重複,類似於這個意思,這題是字母,當做數字範圍1 26就行 對於358來說 c 9,2 c 9,1 c 7,2 c 8,2 c 6,2 不想寫了,應該沒算錯 兩位數和一位數,一定比 ...

POJ 1850 Code 組合數學)

題意 a,b,c,z 26個字母組成word,並要求word內每個字母成公升序排列,按字典序對這些words從1開始進行編碼。給定乙個word輸出編碼。思路 易得,長度為k的word總共有c k,26 個 即取k個按公升序排序 對於乙個給定的word,不妨先算出從到該word長度的所有word數,再...