这道题做得就是一个悲剧。做这道题需要的能力我是达不到的,但感觉有思路,还是做了,当提交的结果不断是是RT、WS、TLE时,盲目的修改,换来的更多是错误,缺乏对这道题整体的理解,有错误时也不知哪儿错了。
这道题要求最长的异或路径:就是在树中找两个节点,两个节点间有唯一路径(因为是树),把路径不断做异或,异或完后求最大的。数据是10万,O(n2)算法超时。我们知道异或有这样的性质:a^b = (a^c)^(b^c),这样就可以考虑找出a与b公共的c,实际上就是求出从根节点到每个节点的异或值,这样任意两个点做异或,即是他们之间的异或路径(相同部分异或抵消了)。可以dfs遍历一遍,我在这里就花了很多时间,用邻接表表示树用的很少,很不熟练。然后可以用字典树来储存每个节点的值,问题又转化成求这n个数中,任意两个数做异或,求最大值,用字典树的复杂度为O(n*31),前面dfs复杂度为O(n),所以效率还是比较好的。程序中注意优化,否则TLE,例如:u、v节点,u可能比v大,我们就交换它们来建邻接点,而不必建两次。
这道题虽然通过率比较低,但并没有什么trap,只是自己对整道题整体把握不好,以后做题要考虑全面,否则这样的教训还会出现。
程序代码: