Trie广泛应用于路径补全、字符串匹配

class Trie{
	struct Node {
		bool is_end; // 当前结点是否为某字符串结尾
		vector<Node*> sons; // 所有可能儿子 a-z
		// unordered_map<string, Node*> sons;
		Node(){ 
			is_end = false;
			sons.resize(26); // a-z
		}
	}*root;
	
	Trie(){
		root = new Node();
	}
	
	void insert(string word) {
		auto p = root;
		for(auto c : word) {
			int u = c - 'a';
			if(!p->sons[u]) p->sons[u] = new Node();
			// if(!p->sons[c]) p->sons[c] = new Node();
			p = p->sons[u];
		}
	}
	
	bool search(string word) {
		auto p = root;
		for(auto c : word) {
			int u = c - 'a';
			if(!p->sons[u]) return false;
			p = p->sons[u];
		}
		return p->is_end;
	}
}