博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu1671(字典树)
阅读量:5111 次
发布时间:2019-06-13

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

呵呵,这道题目的话,也不难吧,就是在节点中添加了俩个标志

因为想要一边添加一边判断是否出现过某个串是某个串的前缀,所以需要添加这俩个标志

一个是v,用来表示是否有一个串在该节点结束,这主要是针对前面的串中出现过当前串的前缀;

另一个是f,用来标志当前当一个串结束时,它是否存在下一个节点,主要针对当前串是之前出现过的串的前缀

添加这俩个标志之后,基本没什么问题了,对了,初始化还是很严重的问题,额,因为有一个地方忘记初始化了,结果wa了一次

额,还有一个蛮严重的,就是每一个case之后,要释放空间,不然内存使用过大了,虽然大牛说过,但我还是固执的提交了一次,悲剧

#include
#include
#include
typedef struct node{ node *next[10]; int v; int f;}*tree,t;tree root;int flag;void insert(char *str){ tree p=root,newnode; for(;*str!='\0';str++) { if(p->next[*str-'0']!=NULL) { p->f=1; p=p->next[*str-'0']; if(p->v==-1)//前面的串中出现过当前串的前缀 flag=1; } else { newnode=(tree)malloc(sizeof(t)); for(int i=0;i<=9;i++) newnode->next[i]=NULL; newnode->v=0; newnode->f=0; p->f=1; p->next[*str-'0']=newnode; p=newnode; } } p->v=-1; if(p->f)//当前串是之前出现过的串的前缀 { flag=1; }}int deal(node* T)//释放内存空间{ int i; for(i=0;i<=9;i++) { if(T->next[i]!=NULL) deal(T->next[i]); } free(T); return 0;}int main(){ int m,n,num; char str[15]; scanf("%d",&m); while(m--) { flag=0; root=(tree)malloc(sizeof(t)); for(int i=0;i<=9;i++) root->next[i]=NULL; root->v=0; root->f=0; scanf("%d",&n);getchar(); while(n--) { gets(str); if(flag)//算是优化吧,可是 还是很慢呀,差距,差距啊 continue; insert(str); //puts(str); } if(!flag) printf("YES\n"); else printf("NO\n"); deal(root); } return 0;}

转载于:https://www.cnblogs.com/nanke/archive/2011/05/12/2044718.html

你可能感兴趣的文章
iBatis/MyBatis
查看>>
[python] Queue.Queue vs. collections.deque
查看>>
【转】在HTML中使用Javascript
查看>>
Ext.Net学习笔记23:Ext.Net TabPanel用法详解
查看>>
3.1.6 循环栅栏:CyclicBarrier
查看>>
线程池(1)
查看>>
awk字符提取
查看>>
linux下安装JDK和Tomcat
查看>>
android仿苹果分段按钮
查看>>
Java序列化
查看>>
【集训笔记】二分图及其应用【HDOJ1068【HDOJ1150【HDOJ1151
查看>>
高效素数判断
查看>>
[分享]linux Y480安装显卡驱动经历!
查看>>
libgdx与Robovm绑定的坑
查看>>
深入浅出VB.NET提示对话框
查看>>
哲理小故事(二)
查看>>
STL学习笔记(三) 关联容器
查看>>
我要好offer之 C++大总结
查看>>
解决jquery操作checkbox全选全不选无法勾选问题
查看>>
ENVISAT ASAR 文件命名规则
查看>>