一种用于检索的数据结构
大致就是开一个数组,记录节点
然后记录经过这个节点的字符串个数,以及这个节点表示的字符串个数
分别用pre pass end记录
复杂度大约为
len∗m
m为操作数,len为字符串长度
复杂度很小,但内存会比较大
代码实现如下:
struct Trie_Tree{
static const int M=3000005;
int pre[M][26],tot;
int pass[M];
void insert(char *str){
int len=strlen(str),cur=0;
FOR(i,0,len-1){
int k=str[i]-'a';
if(!pre[cur][k])pre[cur][k]=++tot;
cur=pre[cur][k];
pass[cur]++;
}
}
void Delete(char *str){
int len=strlen(str),cur=0;
FOR(i,0,len-1){
int k=str[i]-'a';
if(!pre[cur][k])return;
cur=pre[cur][k];
}
int cnt=pass[cur];
cur=0;
FOR(i,0,len-1){
int k=str[i]-'a';
int &d=pre[cur][k];
cur=pre[cur][k];
pass[cur]-=cnt;
if(!pass[cur]){
d=0;
break;
}
}
}
bool query(char *str){
int len=strlen(str),cur=0;
FOR(i,0,len-1){
int k=str[i]-'a';
if(!pre[cur][k])return 0;
cur=pre[cur][k];
}
return pass[cur]>0;
}
}Tree;