24h購物| | PChome| 登入
2011-06-14 22:25:13| 人氣591| 回應0 | 上一篇 | 下一篇

a080. NOI2000 Day2.1.单词查找树

推薦 0 收藏 0 轉貼0 訂閱站台

http://zerojudge.tw/ShowProblem?problemid=a080

內容 :

在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里。为了提高查找和定位的速度,通常都要画出与单词列表所对应的单词查找树,其特点如下:

 

l         根节点不包含字母,除根节点外每一个节点都仅包含一个大写英文字母;

 

l         从根节点到某一节点,路径上经过的字母依次连起来所构成的字母序列,称为该节点对应的单词。单词列表中的每个词,都是该单词查找树某个节点所对应的单词;

 

l         在满足上述条件下,该单词查找树的节点数最少。

 

对一个确定的单词列表,请统计对应的单词查找树的节点数(包括根节点)

輸入說明 :

该文件为一个单词列表,每一行仅包含一个单词和一个换行/回车符。每个单词仅由大写的英文字符组成,长度不超过63个字符。文件总长度不超过32K,至少有一行数据。

輸出說明 :

该文件中仅包含一个整数和一个换行/回车符。该整数为单词列表对应的单词查找树的节点数。

範例輸入 :

A
AN
ASP
AS
ASC
ASCII
BAS
BASIC

範例輸出 :

13

提示 :

出處 :

NOI2000 Day2 第一题 (管理:liouzhou_101)



作法 : trie 模擬

/**********************************************************************************/
/*  Problem: a080 "NOI2000 Day2.1.单词查找树" from NOI2000 Day2 第一题    */
/*  Language: C                                                                   */
/*  Result: AC (2ms, 996KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-06-13 17:10:26                                     */
/**********************************************************************************/


#include<stdio.h>
struct node {
    int ch[26];
}trie[32001];
/*宣告全部值皆為 0*/
main() {
    char s[64];
    int a, b, in = 0;
    while(scanf("%s", s) != EOF) {
        for(a = 0, b = 0; s[a]; a++) {
            if(trie[b].ch[s[a]-'A'] == 0) {
                in ++;
                trie[b].ch[s[a]-'A'] = in, b = in;
            }
            else b = trie[b].ch[s[a]-'A'];
        }
    }
    printf("%d\n", in + 1);
    return 0;
}

台長: Morris
人氣(591) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: 資訊競賽 |
此分類下一篇:d871. NOIP2000 4.单词接龙
此分類上一篇:d892. NOIP2010 1.机器翻译

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文