博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1251 统计难题(字典树)
阅读量:6810 次
发布时间:2019-06-26

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

题目链接:

分析:

关于字典树的题目似乎都有一个普通适用性的模板,有时只是稍加改动来满足临时的要求,我的一个简单的模板

#define MAXNUM 26//定义字典树结构体typedef struct Trie{    bool flag;//从根到此是否为一个单词    Trie *next[MAXNUM];}Trie;//声明一个根Trie *root;//初始化该根void init(){    root = (Trie *)malloc(sizeof(Trie));    root->flag=false;    for(int i=0;i
next[i]=NULL;}//对该字典树的插入单词操作void insert(char *word){ Trie *tem = root; while(*word!='\0') { if(tem->next[*word-'a']==NULL) { Trie *cur = (Trie *)malloc(sizeof(Trie)); for(int i=0;i
next[i]=NULL; cur->flag=false; tem->next[*word-'a']=cur; } tem = tem->next[*word-'a']; word++; } tem->flag=true;}//查询一个单词的操作bool search(char *word){ Trie *tem = root; for(int i=0;word[i]!='\0';i++) { if(tem==NULL||tem->next[word[i]-'a']==NULL) return false; tem=tem->next[word[i]-'a']; } return tem->flag;} //释放字典树内存操作,由于本题测试数据后程序自动跳出,所以这里没写释放内存函数 void del(Trie *cur) {
    for(int i=0;i
next[i]!=NULL)         del(cur->next[i]);     }     free(cur); }

这道题目是一道典型的字典树题目(Trie),题目解法类似于    的解法,这里搜索前缀,然后对后边用一个递归搜索就可以求出有多少字符串是以此字符串为前缀,注意本身也是自己的前缀。

 

#include 
#include
#include
#include
#define MAXNUM 26using namespace std;//单词char words[50005][12];//定义字典树typedef struct Trie{ bool flag;//从根到此是否为一个单词 Trie *next[MAXNUM];}Trie;Trie *root;int count_num;void init(){ root = (Trie *)malloc(sizeof(Trie)); root->flag=false; for(int i=0;i
next[i]=NULL;}void insert(char *word){ Trie *tem = root; while(*word!='\0') { if(tem->next[*word-'a']==NULL) { Trie *cur = (Trie *)malloc(sizeof(Trie)); for(int i=0;i
next[i]=NULL; cur->flag=false; tem->next[*word-'a']=cur; } tem = tem->next[*word-'a']; word++; } tem->flag=true;}void dfs(Trie *cur){ if(cur->flag)count_num++; for(int i=0;i
next[i]!=NULL) dfs(cur->next[i]); }}int search(char *word){ Trie *tem = root; count_num = 0; for(int i=0;word[i]!='\0';i++) { if(tem==NULL||tem->next[word[i]-'a']==NULL) return 0; tem=tem->next[word[i]-'a']; } dfs(tem); return 1;}int main(){ init(); int t=0; char w[12]; while(gets(w)) { if(*w=='\0')break; insert(w); t++; } while(scanf("%s",w)!=EOF) { search(w); printf("%d\n",count_num); } return 0;}
http://www.cnblogs.com/newpanderking/archive/2012/11/02/2751665.html
你可能感兴趣的文章
Linux网卡名改eth0方法
查看>>
指针的意义和linux的内存回收艺术
查看>>
WP7实例篇之土豆搜索器(2)
查看>>
用SHELL脚本自动化安装Nagios服务器端和客户端的
查看>>
JAVA多线程之中断机制(如何处理中断?)
查看>>
vba 工作案例1
查看>>
利用Python了解微信通信机制,实现查询有多少好友删除你!!
查看>>
【mybatis深度历险系列】mybatis中的动态sql
查看>>
瑞典驻华参赞:智慧城市建设提升为国家战略
查看>>
淘富成真,硬件智能—— 硬件创新一站赋能平台
查看>>
网友神总结:我们继续用 XP 的十大理由
查看>>
2014年8月份国内主浏览器市场份额排行榜
查看>>
优云automation实践技巧:简单4步完成自动化构建与发布
查看>>
用Dart搭建HTTP服务器(2)
查看>>
如何恢复丢失的分区及文件
查看>>
Java之品优购部署_day02(2)
查看>>
50+ 实用的 Docker 工具推荐
查看>>
【HBase从入门到精通系列】如何避免HBase写入过快引起的各种问题
查看>>
Changing the Filter of a List Collector Variable
查看>>
2019物联网博览会专业展览会-参加展会我们最专业
查看>>