293. [NOI2000] 单词查找树——COGS

293. [NOI2000] 单词查找树

★★   输入文件:trie.in   输出文件:trie.out   简单对比
时间限制:1 s   内存限制:128 MB

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

  • 根节点不包含字母,除根节点外每一个节点都仅包含一个大写英文字母;
  • 从根节点到某一节点,路径上经过的字母依次连起来所构成的字母序列,称为该节点对应的单词。单词列表中的每个词,都是该单词查找树某个节点所对应的单词;
  • 在满足上述条件下,该单词查找树的节点数最少。

单词列表对应的单词查找树

A
AN
ASP
AS
ASC
ASCII
BAS
BASIC 

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

[输入文件]

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

[输出文件]

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

[输入输出文件样例]

Input

A
AN
ASP
AS
ASC
ASCII
BAS
BASIC

Output

13

Trie树插入模板


#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define N 101010

using namespace std;

void in(int &x){
    register char c=getchar();x=0;int f=1;
    while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    x*=f;
}

char s[N]; 
int trie[N][26],tot;

void insert(){
    int l=strlen(s);
    int root=0;
    for(int i=0;i<l;i++){
        int id=s[i]-'A';
        if(!trie[root][id]) trie[root][id]=++tot;
        root=trie[root][id];
    }
}

int main()
{
    freopen("trie.in","r",stdin);freopen("trie.out","w",stdout);
    while(scanf("%s",s)==1){
        insert();
    }printf("%d\n",tot+1);
    return 0;
}

 

  



posted @ 2018-07-14 09:13  清风我已逝  阅读(218)  评论(0编辑  收藏  举报