t1
二分答案,贪心匹配(当前如果匹配,一定是上一个匹配的组+1)
t2
考虑预处理,将奇数位反转。
这样限制变成了ab->bb , ba -> aa。
考虑相邻字符不同的位置:
- 用差分数组 a 和 b 表示 X 和 Y 的边界:
- a[i]=1 表示 Xi=Xi−1
- b[i]=1 表示 Yi=Yi−1
X 能转换为 Y 当:
-
对于任意前缀
[1,k],
X 的边界数
≥ Y 的边界数。
即:
∀k∈[1,n],∑a[i]≥∑b[i]
-
X 和
Y 的最后一个字符在变换后相同
等价于:
⨁1nai=⨁1nbi
使用线段树维护数组:
d[k]=∑i=1ka[i]−∑i=1kb[i]
题目条件等价于:
- 前缀: mink=1nd[k]≥0
- 整体: 维护 ⨁1nai 和 ⨁1nbi
当翻转原始字符串的第 p 个字符时:
- 翻转 a[p]
- 更新线段树:
- 翻转 a[p]:对区间 [1,p] 加 Δ(Δ=1 如果 a[p]→1 ,否则为−1)
- 翻转 a[p+1]
- 更新 ca:ca←ca⊕1(如果 p=n)
更新Y:
同理,翻转同时维护
b[p] 和
b[p+1]
每次更新后,检查:
- 最小值 ≥0
- ca=cb
即可。
cf1763c
分类讨论。
- n>4时,ans=maxai
考虑1 1 4 5 1 4 -> 1 1 4 5 3 3 -> 1 1 4 5 0 0(造0)
->1 1 4 5 5 5-> 0 0 4 5 5 5 -> 5 5 5 5 5 5
在右断点造0,把max传播到右端点,在对左端点做一遍即可。
- n=2 , ans=max(a1+a2,2∗∣a1−a2∣)
显然只有两种情况。
- n=3,max∈{a1,a3} : 同n>3
- n=3,max=a2:
- (1,3) : 3∣a3−a1∣→ans
- (1,2) : 3⋅max(∣a2−a1∣,a3)→ans
做完后有∣a2−a1∣,a3两个值,可以取最大的。
- (2,3) : 3⋅max(∣a3−a2∣,a1)→ans
cf2124e
先考虑什么情况无解:
- ∑ai=1(mod2)