求递增子序列所有不同的异或值

显然,对于递增子序列x<y<z,ax XOR ay XOR az=Ax<y<z,a_x\ XOR\ a_y\ XOR\ a_z = A,如果有d>z,ad>azd>z,a_d>a_z,那么可以得到A XOR dA\ XOR\ d

于是有两种方法来通过动态规划转移:

方法一:

按序列的下标从小到大开始转移,对于当前序列的下标ii,一定是目前最大的,dp[x]dp[x]存前面的递增子序列异或得到xx时递增子序列最后一个数的最小值,只要那么只要满足a[i]>dp[x]a[i]>dp[x]就可以得到(a[i] XOR x)(a[i]\ XOR\ x)

code

方法二:

按序列的值从小到大开始转移,对于当前序列的值ii,一定是目前最大的,dp[x]dp[x]存前面的递增子序列异或得到xx时递增子序列最后一个数下标的最小值,只要那么只要找到最小的pos,(pos>dp[x]&&apos==i)pos,(pos>dp[x]\&\&a_{pos}==i)就可以得到(i XOR x)(i\ XOR\ x)

code