P5658 括号树
P5658 括号树 题解 太菜了啥都不会写只能水5分数据 啥都不会写只能翻题解 题解大大我错了 我们手动找一下规律 我们设 w[ i ] 为从根节点到结点 i 对答案的贡献,也就是走到结点 i ,合法括号串又 多了几个 sum[ i ] 为从根节点到结点 i 总共 合法括号串数 ()()() w[i] 依次为 0 1 0 2 0 3 sum[i] 依次为 0 1 1 3 3 6 ())() w[i] 依次为 0 1 0 0 1 sum[i] 依次为 0 1 1 1 2 ()(()) w[i] 依次为 0 1 0 0 1 2 sum[i] 依次为 0 1 1 1 2 4 然后我们惊奇的发现 sum[i] 是 w[i] 的前缀和 最后要求的其实就是所有的 sum[i]*i 的异或和,所以当务之急只找到求解 w[ i ] 的方法 (1)发现如果 s[i] 是个左括号,那么显然不会有新的贡献出现,也就是w[i]=0 (2)如果 s[i] 是个右括号,那么我们找到他对应上一个右括号,贡献值也就是上一个右括号的贡献值+1:其实也就相当于,对于当前右括号,(如果条件允许)他有左括号与之匹配,对答案贡献为1,然鹅当前右括号对应的前一个右括号,他本就会对答案有一定的贡献,加上当前新匹配的一对括号,就生成新的匹配括号串,那么我们就将它作为当前右括号的贡献存下 举个栗子:()()() )() w[4]