CF1720D2
感觉静下来能想出来?整个思路没有太容易走偏的地方,就最后一段有点难
首先看到异或想到01trie和拆位,然后看到要求最长子序列,想到dp。所以目前的想法就是01trie里存dp,然后按照某种方式找到最大的,来更新\(dp_{i}\)。
不会了!\(a_{i} \oplus j>a_{j} \oplus i\)怎么搞啊。我们拆位,发现如果这两个满足条件,那一定是这两个前k-1位相同,然后k位一个1,一个0。那么就可以得到下列条件
\[a_{i,1,k-1} \oplus j,1,k-1=a_{j,1,k-1} \oplus i,1,k-1
\]
\[a_{i,k} \oplus j,k=1
\]
\[a_{j,k} \oplus i,k=0
\]
对于第一个式子直接移项,将未知数(或者字母相同的)移到一边,后面两个式子同样处理
\[a_{j,1,k-1} \oplus j,1,k-1=a_{i,1,k-1} \oplus i,1,k-1
\]
\[j,k=1 \oplus a_{i,k}
\]
\[a_{j,k} = i,k
\]
考虑在01trie上如何搞这个东西,发现第一个只要\(a_{j} \oplus j\)和\(a_{i} \oplus i\)一样的路就行了,这启示我们将\(a_{i} \oplus i\)插到01trie中,然后记录\(ans_{u,0/1,0/1}\),也就是能走到这个点的\(a_{i,k}\)为0/1,且\(i,k\)为0/1的dp的最大值。然后走下去每一层都和\(ans[u][i,k][1 \oplus a_{i,k}]\)取最大值,最后+1就是\(dp_{i}\)了,插入就正常插入