Trie

· · 个人记录

预处理

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

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

如果应用范围为 01 串,你可以把 standard 设为 0

操作

$\text{insert(s)}$:插入字符串 $s$。 $\text{remove(s)}$:删除字符串 $s$(如果存在的话)。 ```cpp 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)$,其中 $len$ 是操作的字符串的大小,空间复杂度 $O(NC)$ ,其中 $N$ 是节点个数,$C$ 是字符集的大小。