diff --git a/CMakeLists.txt b/CMakeLists.txt index f3400d6..ebc1fac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ add_compile_options(-fsanitize=address,pointer-compare,pointer-subtract,undefine add_link_options(-fsanitize=address,pointer-compare,pointer-subtract,undefined -fno-omit-frame-pointer) include_directories(${CMAKE_CURRENT_LIST_DIR}/include) -set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD 26) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) diff --git a/src/8/22/P4551.cpp b/src/8/22/P4551.cpp new file mode 100644 index 0000000..7d49728 --- /dev/null +++ b/src/8/22/P4551.cpp @@ -0,0 +1,96 @@ +#include +#include +#include + +void fast_io() { + std::ios_base::sync_with_stdio(false); + std::cin.tie(NULL); +} + +const int MAXN = 100005; +const int BITS = 31; +std::vector> adj[MAXN]; +int dist[MAXN]; +namespace Trie { + int trie[MAXN * BITS][2]; + int nodec; + + void init() { + trie[0][0] = trie[0][1] = 0; + nodec = 1; + } + + void insert(int val) { + int curnode = 0; + + for (int i = BITS - 1; i >= 0; --i) { + int bit = (val >> i) & 1; + if (!trie[curnode][bit]) { + + trie[nodec][0] = trie[nodec][1] = 0; + trie[curnode][bit] = nodec++; + } + curnode = trie[curnode][bit]; + } + } + + int query_max_xor(int val) { + int curnode = 0; + int maxorval = 0; + for (int i = BITS - 1; i >= 0; --i) { + int bit = (val >> i) & 1; + + if (trie[curnode][!bit]) { + maxorval |= (1 << i); + curnode = trie[curnode][!bit]; + } else { + + curnode = trie[curnode][bit]; + } + } + return maxorval; + } +} + +void dfs(int u, int p, int curxorsum) { + dist[u] = curxorsum; + for (auto &edge : adj[u]) { + int v = edge.first; + int weight = edge.second; + if (v == p) { + continue; + } + dfs(v, u, curxorsum ^ weight); + } +} + +int main() { + fast_io(); + + int n; + std::cin >> n; + + for (int i = 0; i < n - 1; ++i) { + int u, v, w; + std::cin >> u >> v >> w; + + adj[u].push_back({v, w}); + adj[v].push_back({u, w}); + } + + dfs(1, 0, 0); + + Trie::init(); + for (int i = 1; i <= n; ++i) { + Trie::insert(dist[i]); + } + + int max_ans = 0; + for (int i = 1; i <= n; ++i) { + max_ans = std::max(max_ans, Trie::query_max_xor(dist[i])); + } + + std::cout << max_ans << '\n'; + + return 0; +} diff --git a/src/test.cpp b/src/test.cpp index c7d4a71..312f870 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -1,64 +1,4 @@ -#include -class MyLinkedList { -public: - std::list l; - MyLinkedList() { - - } - - int get(int index) { - if(index>=l.size()){ - return -1; - } - auto p = l.begin(); - while(index--){ - p++; - } - return *p; - } - - void addAtHead(int val) { - l.push_front(val); - } - - void addAtTail(int val) { - l.push_back(val); - } - - void addAtIndex(int index, int val) { - if(index==l.size()){ - l.push_back(val); - return; - } - if(index>l.size())return; - auto p = l.begin(); - while(index--){ - ++p; - } - l.insert(p,val); - } - - void deleteAtIndex(int index) { - if(0<=index && indexget(index); - * obj->addAtHead(val); - * obj->addAtTail(val); - * obj->addAtIndex(index,val); - * obj->deleteAtIndex(index); - */ - - int main(){ +int main(){ - } \ No newline at end of file +} \ No newline at end of file