rt。 考虑双指针,一开始指针 i 指向 1,然后对于每一个 i,如果 s[i]=t[i],++i,否则维护 j1,j2,代表可以用的推平的最远修复距离和反转的最远修复距离,最后 ans++,i=max(j1,j2)+1
最远修复距离是指最大下标 j 使得对 [i,j] 操作用该操作之后 s[i,j]==t[i,j]
#include <bits/stdc++.h>
using namespace std;
basic_string<char> tmp1, tmp2;
int T;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> T;
while (T--) {
cin >> tmp1 >> tmp2;
bitset<500005> s(tmp1), t(tmp2);
int i, ans = 0;
for (i = 0; i < tmp1.size();) {
if (s[i] == t[i]) {
++i;
} else {
int j = i, k = i;
while (j < tmp1.size() && s[j] != t[j]) {
++j;
}
if (t[i]) {
while (k < tmp1.size() && t[k]) {
++k;
}
} else {
while (k < tmp1.size() && !t[k]) {
++k;
}
}
i = max(j, k);
ans++;
}
}
cout << ans << "\n";
}
return 0;
}
代码10pts,请问是思路问题还是实现错误?