Trie

预处理

使用前,请根据需要更改字典树标准 standardstandard

如果应用范围为 2626 个字母,你可以把 standardstandard 设为 a

如果应用范围为 0101 串,你可以把 standardstandard 设为 0

操作

search(s)\text{search(s)}:检索字符串 ss 的个数。

insert(s)\text{insert(s)}:插入字符串 ss

remove(s)\text{remove(s)}:删除字符串 ss(如果存在的话)。

struct Trie{
	int tot;
	char standard;
	struct Tree{
		int son[26];
		int end;
	}a[N];
	Trie(){
		tot=1;
		standard='a';
	}
	int search(string str){
		int len=str.size(),p=1;
		for(int k=0;k<len;k++){
			p=a[p].son[str[k]-standard];
			if(!p)
				return 0;
		}
		return a[p].end;
	}
	void insert(string str){
		int len=str.size(),p=1;
		for(int k=0;k<len;k++){
			int ch=str[k]-standard;
			if(!a[p].son[ch])
				a[p].son[ch]=++tot; 
			p=a[p].son[ch];
		}
		a[p].end++;
	}
	void remove(string str){
		int len=str.size(),p=1;
		for(int k=0;k<len;k++){
			int ch=str[k]-standard;
			if(!a[p].son[ch])
				return; 
			p=a[p].son[ch];
		}
		if(a[p].end)
			a[p].end--;
	}
};

单项操作时间复杂度 O(len)O(len),其中 lenlen 是操作的字符串的大小,空间复杂度 O(NC)O(NC) ,其中 NN 是节点个数,CC 是字符集的大小。

posted @ 2021-08-30 13:33  luckydrawbox  阅读(11)  评论(0)    收藏  举报  来源