// Zahlenwerte müssen bei 0 beginnen und zusammenhängend sein. constexpr int ALPHABET_SIZE = 2; struct node { int words, ends; array nxt; node(): words(0), ends(0) { ranges::fill(nxt, -1); } }; vector trie = {node()}; int traverse(const vector& word, int x) { int id = 0; for (int c : word) { if (trie[id].words == 0 && x <= 0) return -1; trie[id].words += x; if (trie[id].nxt[c] < 0 && x > 0) { trie[id].nxt[c] = ssize(trie); trie.emplace_back(); } id = trie[id].nxt[c]; if (id < 0) return -1; } trie[id].words += x; trie[id].ends += x; return id; } int insert(const vector& word) { return traverse(word, 1); } bool erase(const vector& word) { int id = traverse(word, 0); if (id < 0 || trie[id].ends <= 0) return false; traverse(word, -1); return true; }