分类
标签
2-SAT AC自动机 BFS CDQ dfs DP fail树 FFT FFT&NTT FWT hash KD-Tree KMP LCA SPFA STL Tarjan Treap Trie 主席树 乱搞 二分 二分图匹配 二分答案 二维SPFA 交互 位运算 其他 最小生成树 分块 区间DP 半平面交 博弈论 可持久化 可持久化Trie树 后缀数组 图库 平衡树 并查集 插头DP 数学 数论 无旋Treap 日记 暴力 权值树状数组 栈 树DP 树套树 树状数组 树贪心 概率DP 模拟 欧拉定理 点分治 状压DP 生成函数 矩阵乘 线性规划 线段树 组合 网络流 群论 莫比乌斯反演 计算几何 贪心 费用流 高斯消元
448 字
2 分钟
[NOI2000] 单词查找树
[题目描述]
在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里。为了提高查找和定位的速度,通常都要画出与单词列表所对应的单词查找树,其特点如下:
- 根节点不包含字母,除根节点外每一个节点都仅包含一个大写英文字母;
- 从根节点到某一节点,路径上经过的字母依次连起来所构成的字母序列,称为该节点对应的单词。单词列表中的每个词,都是该单词查找树某个节点所对应的单词;
- 在满足上述条件下,该单词查找树的节点数最少。
单词列表对应的单词查找树
A
AN
ASP
AS
ASC
ASCII
BAS
BASIC
对一个确定的单词列表,请统计对应的单词查找树的节点数(包括根节点)
[输入文件]
该文件为一个单词列表,每一行仅包含一个单词和一个换行/回车符。每个单词仅由大写的英文字符组成,长度不超过63个字符。文件总长度不超过32K,至少有一行数据。
[输出文件]
该文件中仅包含一个整数和一个换行/回车符。该整数为单词列表对应的单词查找树的节点数。
[输入输出文件样例]
Input
A
AN
ASP
AS
ASC
ASCII
BAS
BASIC
Output
13
题解
裸的Trie树
直接套板子
/*
* @Author: WildRage
* @Date: 2017-06-13 10:24:04
* @Last Modified by: WildRage
* @Last Modified time: 2017-06-13 10:24:04
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct Trie_Node{
Trie_Node *ch[27];
Trie_Node(){
memset(ch,0,sizeof(ch));
}
}*root;
int ans;
inline void insert(char *s){
int len=strlen(s);
Trie_Node *now=root;
for(int i=0;i<len;i++){
if(now->ch[s[i]-'A']==NULL)
now->ch[s[i]-'A']=new Trie_Node,ans++;
now=now->ch[s[i]-'A'];
}
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
char s[105];
root=new Trie_Node;ans++;
while(scanf("%s",s)!=EOF) insert(s);
printf("%d",ans);
}