1. 程式人生 > >[NOI2000] 單詞查找樹

[NOI2000] 單詞查找樹

-a 技術 borde trie樹 har build 技術分享 col isp

[NOI2000] 單詞查找樹

在進行文法分析的時候,通常需要檢測一個單詞是否在我們的單詞列表裏。為了提高查找和定位的速度,通常都要畫出與單詞列表所對應的單詞查找樹,其特點如下:

  • 根節點不包含字母,除根節點外每一個節點都僅包含一個大寫英文字母;
  • 從根節點到某一節點,路徑上經過的字母依次連起來所構成的字母序列,稱為該節點對應的單詞。單詞列表中的每個詞,都是該單詞查找樹某個節點所對應的單詞;
  • 在滿足上述條件下,該單詞查找樹的節點數最少。

單詞列表對應的單詞查找樹

A
AN
ASP
AS
ASC
ASCII
BAS
BASIC 技術分享

對一個確定的單詞列表,請統計對應的單詞查找樹的節點數(包括根節點)

[輸入文件]

該文件為一個單詞列表,每一行僅包含一個單詞和一個換行/回車符。每個單詞僅由大寫的英文字符組成,長度不超過63個字符。文件總長度不超過32K,至少有一行數據。

[輸出文件]

該文件中僅包含一個整數和一個換行/回車符。該整數為單詞列表對應的單詞查找樹的節點數。

[輸入輸出文件樣例]

Input

A
AN
ASP
AS
ASC
ASCII
BAS
BASIC

Output

13


技術分享
 1 /*
 2     查詢trie樹有多少節點
 3     一定要加上根節點 
 4
*/ 5 #include <cstring> 6 #include <ctype.h> 7 #include <cstdio> 8 9 const int MAXN=100010; 10 11 int n,tot; 12 13 struct node { 14 int next[27]; 15 }; 16 node t[MAXN]; 17 18 char s[MAXN][65]; 19 20 inline void build(int p) { 21 int now=0; 22 int len=strlen(s[p]);
23 for(int i=0;i<len;++i) { 24 int x=s[p][i]-A+1; 25 if(!t[now].next[x]) t[now].next[x]=++tot; 26 now=t[now].next[x]; 27 } 28 return; 29 } 30 31 int hh() { 32 freopen("trie.in","r",stdin); 33 freopen("trie.out","w",stdout); 34 int i=1; 35 while(scanf("%s",s[i])!=EOF) 36 build(i),++i; 37 printf("%d\n",tot+1); 38 return 0; 39 } 40 41 int sb=hh(); 42 int main() {;}
代碼

[NOI2000] 單詞查找樹