暑假培训的时候ac自动机就没搞太懂,现在又听了一遍北大老师讲的,总算明白了一些,准备自己写代码实现一下匹配的功能:
首先是tire树的构造,采用了构造函数的用法,而且是采用的是静态存储空间,降低了存储的难度,更加容易写和掌控,避免了空间的释放;
采用Next指针是用的多建立了一个0节点,0节点指向首节点的方式是next的赋值运算更加简单。next是寻找父节点的next节点的孩子是否和要找的字母相匹配。
然后要注意的是危险节点和终止节点的关系,危险节点时其next指针指向终止节点,叫做危险节点,能有效的排除模式匹配用漏过的字符。
tire树的构造,采用构造函数的方法。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> //对tire树进行初始化的验证,在开辟内存空间的时候赋初值。 using namespace std; const int letters=26; struct Cnode{ Cnode * pchild[letters] ; Cnode *pre; bool stopnode; Cnode(){ memset(pchild,0,sizeof(pchild)); pre=NULL; stopnode=0; printf("a\n"); //验证会不会进行 赋值操作,会的话会输出 a字符 } }; int main() { struct Cnode *p; p=new Cnode(); int i; cin>>i; }