早上照着书本敲了一个小时
崩掉了,先扔这里,以后再调试
#include<cstdio>
#include<cstring>
#include<vector>
#include<list>
using namespace std;
//后缀树节点预备备
struct SfxNode{
char *l,*r;//指向字符数组的指针,表示其父亲边标记为子串[l,r)
SfxNode* SfxLink; //好名字,后缀链,指向第一个节点
list<int> from;//推广到多串的形式
SfxNode* father;//在后缀树中的父亲节点
SfxNode* firstCh;//在后缀树中的第一个孩子节点(如果没有,那么为叶节点)//说实话忘记了这是用来干什么的
SfxNode* left;//左兄弟,即父亲的孩子排列中排在该节点前一个的节点//似乎是为了应用扩展规则
SfxNode* right;//右兄弟,与上面类似
//获取当前节点的孩子中,边标记以c开始的那个孩子//与技巧一配合
SfxNode* child(char c)const{
SfxNode *p=NULL;
if (firstCh&&*firstCh->l<=c)
p=firstCh; //这一步不是很理解,为什么要小于等于c,不是直接找标记以c开始的那个孩子吗?
else return p;//不存在,直接返回空指针
while (p->right&&*p->right->l<=c)
p=p->right;//找到编号小于等于c的最大的孩子(如果有编号为c就返回该孩子,否则返回将要插入位置的左兄弟)
return p;
}
//添加新的子节点add。p为add的左兄弟
void addChild(SfxNode* p,SfxNode* add){
if (p)
{
add->right=p->right;
add->left=p;
p->right=add;
if (add->right)
add->right->left=add;//一系列链表维护的基本操作,简单
}
else {
//否则为第一个孩子节点
add->left=NULL;
add->righ