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;
}

浙公网安备 33010602011771号