hdu1251
并查集告一段落啦,先放下吧,今晚再做一下总结吧
之后转入字典树的学习
这道题目是比较基础的而且明显的字典树
慢慢来吧
题意比较明显,查找以某一个串为前缀的单词的数目,字典树还有一个名称,就是前缀树,所以就很明显了吧
不过下面的代码用的是比较朴素的方法,root->next[],开的内存太大了,不过速度也相对快了
root->cnt记录的是以从根节点到达该节点组成的串为前缀的单词的个数
此题涉及到字典树的俩个基本操作,插入还有查找,代码很容易理解
#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct node { int cnt; struct node *next[26]; }*tree,t; tree root; void insert( char *str) { tree p=root,newnode; for (;*str!= '\0' ;str++) { if (p->next[*str- 'a' ]!=NULL) { p=p->next[*str- 'a' ]; p->cnt++; } else { newnode=(tree) malloc ( sizeof (t)); for ( int i=0;i<26;i++) newnode->next[i]=NULL; newnode->cnt=1; p->next[*str- 'a' ]=newnode; p=newnode; } } } int find( char *str) { tree p=root; for (;*str!= '\0' ;str++) { if (p->next[*str- 'a' ]!=NULL) p=p->next[*str- 'a' ]; else return 0; } return p->cnt; } int main() { char str[16]; root=(tree) malloc ( sizeof (t)); for ( int i=0;i<26;i++) root->next[i]=NULL; root->cnt=0; //根节点初始化当然为0,不包含任何字母 while ( gets (str)) { if ( strcmp (str, "" )==0) break ; insert(str); } while ( gets (str)) { //if(strcmp(str,"")==0) //break; printf ( "%d\n" ,find(str)); } return 0; } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步