并查集告一段落啦,先放下吧,今晚再做一下总结吧
之后转入字典树的学习
这道题目是比较基础的而且明显的字典树
慢慢来吧
题意比较明显,查找以某一个串为前缀的单词的数目,字典树还有一个名称,就是前缀树,所以就很明显了吧
不过下面的代码用的是比较朴素的方法,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; }