NANDrepeatedly
[ABC310E] NAND repeatedly
规律
- 对于每个 \(0\),答案必为 \(1\)。(开头除外)
- 对于每个连续的 \(1\) 段,必定为 \(01\) 交替。(\(1\) 在第一/二个的 \(1\) 段除外,为 \(10\) 交替)。
这两点比较显然,在此不给出证明。
考虑每次删去头部元素会产生的影响;
-
如果前两个是 \(0,1\),本来 \(0\barwedge1=1,1=1\),无影响。
-
\(1,0\),答案先 \(-2\)(因为本来少了 \(1\),又因为 \(1,0\) 的运算没了),其次,如果此时的第三位是 \(1\),那么如果这个连续段的 \(1\) 个数为奇数,答案再增加 \(1\)。
-
\(0,0\),先 \(-1\),然后同 2.
-
\(1,1\),如果第三位是 \(0\),无影响(\(1,1,0\),答案为 \(1,0,1\),\(1,0\) 为 \(1,1\))。如果第三位为 \(1\),算上前两个一共连续偶数个,则不变,否则 \(-1\)。
综上,每次维护处理到的第三位往后连续 \(1\) 个数即可。
复杂度 \(O(n)\)。
处理时需格外注意开头就是 \(1\) 的连续段。