学完字典树后 还是背不住模板…………介绍写在代码里————
struct Trie{ ll ch[N][26],sz,val[N]; //val为附加信息 //这里的ch数组,第二维的大小为26是因为字符串只由小写字母构成,第二维的大小一般是由字符串的组成决定 //sz即为节点编号 Trie(){ sz=1;//一开始的时候只有根节点这一个节点 memset(ch[0],0,sizeof(ch[0])); memset(val,0,sizeof(val)); }//这里是初始化 ll idx(char c){return c-‘a‘;}//返回字符c的编号 void insert(char *s,ll v){ //插入操作 ,这里是整份代码中唯一用到指针的地方,因为函数是放在结构体里面 ,所以最好用个指针,其实等价于char s[] //s代表要插入的字符串,v为附加信息 ll u=0,len=strlen(s+1); for(ll i=1;i<=len;i++){ ll c=idx(s[i]); if(!ch[u][c]){//如果节点不存在就插入,不然就继续往下遍历 memset(ch[sz],0,sizeof(ch[sz])); val[sz]=0;//中间的节点是没有附加信息的 ch[u][c]=sz++;//新建节点 } u=ch[u][c];//往下遍历 } val[u]=v;//插入附加信息,注意,我们一般只在叶子节点插入附加信息,中间的节点一般是没有附加信息的,因为一个非叶子结点,在Trie中一般都会被不同的单词使用到(定义) } }tree;
原文地址:https://www.cnblogs.com/liuxiangyu666/p/11403513.html
时间: 2024-10-08 00:15:56