博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
杭电ACM——1251,统计难题(Trie树)
阅读量:4049 次
发布时间:2019-05-25

本文共 1164 字,大约阅读时间需要 3 分钟。

此题为Trie树(字典树)的模板题。

Trie树的概念、性质及讲解可参考该博客:

本题采用了静态的模板,只用数组进行操作。

代码如下:

#include
#include
#include
#include
using namespace std;const int maxn=1e6+5; //表示节点总数(要足够大)int Trie[maxn][26]; //Trie[i,j]表示第i个节点通过路径j到达的节点编号int num[maxn]={0}; //num[i]表示节点的属性(Trie数的节点是空的,其属性得依据题意来定),在此表示以该字符串为前缀的单词个数char s[11];int tot=1; //表示节点的个数void insert() //插入{ int len=strlen(s); int node=0; //node表示节点的编号,node=0,其实也就是根,从根开始搜索 int i,side; //side表示边(路径) for(i=0;i<=len-1;i++) { side=s[i]-'a'; if(Trie[node][side]==0) //等于0说明这个字母还没有插入,就得进行插入操作 Trie[node][side]=tot++; node=Trie[node][side]; //转换节点,继续搜索 num[node]++; //以该串为前缀的单词数+1 }}int inquire() //询问以某个串为前缀的单词数{ int len=strlen(s); int node=0; //依旧从根开始 int i,side; for(i=0;i<=len-1;i++) { side=s[i]-'a'; if(Trie[node][side]==0) //等于0就说明所建立的Trie树没有保存这个串,直接返回0即可 return 0; node=Trie[node][side]; //否则,转换节点,继续搜索 } return num[node]; }int main(){ int ans; while(gets(s)) //这里运用了一个输入的技巧,gets可以读取一个空行,且会把'\n'转化为'\0' { if(s[0]=='\0') break; insert(); } while(~scanf("%s",s)) { ans=inquire(); printf("%d\n",ans); } return 0;}

这道题要好好消化,很有帮助。今后还会写一下动态的模板(等我学会了。。。)

转载地址:http://yddci.baihongyu.com/

你可能感兴趣的文章
opencv学习——在MFC中读取和显示图像
查看>>
C/C++中关于动态生成一维数组和二维数组的学习
查看>>
JVM最简生存指南
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
持续可用与CAP理论 – 一个系统开发者的观点
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
c++字符数组和字符指针区别以及str***函数
查看>>
c++类的操作符重载注意事项
查看>>
c++模板与泛型编程
查看>>
WAV文件解析
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
WPF UI&控件免费开源库
查看>>
QT打开项目提示no valid settings file could be found
查看>>
Win10+VS+ESP32环境搭建
查看>>
android 代码实现圆角
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>