int p=0;
for(int i=0;str[i];i){
//用数字0~25代表a~z
int u=srt[i]-‘a’;
//判断这个结点是否存在这个字母,如果不存在的话,新创一个结点存储该字母
//p表示的是第几个结点,u表示的是哪个字母,如果s[p][u]不为空就证明有以这个字母为值的子结点
//它代表的值就是指向了该子结点,即说明了第几个结点是它的子结点
//如s[2][1]=3,表示结点2有一个值为b(第二个数字代表的是a~z)的子结点,是结点3(2是父节点,3是子节点)
if(!son[p][u]) son[p][u]=idx;
//令p指向子结点
p=son[p][u];
}
//以这个结点为末尾的字符串次数加1
cnt[p]++;
}
补充:son[p][u]=idx 的意思是p的子节点有idx,二维数组这一行代表父节点,这一行的每一列代表,当前节点下的字母对应位置在哪。
求关注