hdu 1251 統計難題(字典樹)

2021-08-04 20:37:27 字數 1792 閱讀 4338

problem description

ignatius最近遇到乙個難題,老師交給他很多單詞(只有小寫字母組成,不會有重複的單詞出現),現在老師要他統計出以某個字串為字首的單詞數量(單詞本身也是自己的字首).

input

輸入資料的第一部分是一張單詞表,每行乙個單詞,單詞的長度不超過10,它們代表的是老師交給ignatius統計的單詞,乙個空行代表單詞表的結束.第二部分是一連串的提問,每行乙個提問,每個提問都是乙個字串.

注意:本題只有一組測試資料,處理到檔案結束.

output

對於每個提問,給出以該字串為字首的單詞的數量.

sample input

banana

band

beeabsolute

acmba

bband

abc

sample output

231

0

題意:應該能看的懂不解釋,

思路字典樹的水題,適合新手連(我也是初練字典樹)

又稱單詞查詢樹,

trie樹

,是一種

樹形結構

,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的

字元 串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比

雜湊表 高。

就是用空間來換時間,空間複雜度特別大,比如字典數單單存26個小寫字母,那麼每個節點的孩子節點都有26個孩子節點,字典樹中的每一層都保留著不同單詞的相同字母。

舉個栗子:就用 abcd四個單詞代表26個英文單詞

指標實現:如果用g++(64位指標)提交 超記憶體 c++(32位指標)提交可以過  ,,也可用陣列實現後面有陣列實現**。。

code

#include#include#includeusing namespace std;

const int maxm=12,maxn=26;

struct node///數的結構體

;node root;

void createtrie(char *str)///插入函式

p->next[id]=q;///在樹上填

p=p->next[id];///指標下移

}else

}}int find(char *str)///查詢字首

}return p->cut;///返回字首的個數

}int main()

while(scanf("%s",str)!=eof)

return 0;

}

陣列實現**  但是有乙個問題 就是  不知為什麼 把陣列初始化後會增加很多記憶體 然後就超記憶體 了

求解 code:

#include#include#define maxn 1000010

#define maxa 26

using namespace std;

int node[maxn][maxa];

int num[maxn];

int pos=1;

void init()

{ memset(node,0,sizeof(node));

memset(num,0,sizeof(num));

/*for(int i=0;i

HDU 1251統計難題(字典樹)

經典的字典樹題目。字典樹 又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。ac code ...

HDU1251統計難題 字典樹

題目 problem description ignatius最近遇到乙個難題,老師交給他很多單詞 只有小寫字母組成,不會有重複的單詞出現 現在老師要他統計出以某個字串為字首的單詞數量 單詞本身也是自己的字首 input 輸入資料的第一部分是一張單詞表,每行乙個單詞,單詞的長度不超過10,它們代表的...

hdu 1251 統計難題 字典樹

problem description ignatius最近遇到乙個難題,老師交給他很多單詞 只有小寫字母組成,不會有重複的單詞出現 現在老師要他統計出以某個字串為字首的單詞數量 單詞本身也是自己的字首 input 輸入資料的第一部分是一張單詞表,每行乙個單詞,單詞的長度不超過10,它們代表的是老師...