我的思路正确与否?
查看原帖
我的思路正确与否?
537934
litjohn楼主2024/7/14 10:20

rt。 考虑双指针,一开始指针 ii 指向 11,然后对于每一个 ii,如果 s[i]=t[i],++is[i]=t[i],++i,否则维护 j1,j2j1,j2,代表可以用的推平的最远修复距离和反转的最远修复距离,最后 ans++,i=max(j1,j2)+1ans++,i=max(j1,j2)+1

最远修复距离是指最大下标 jj 使得对 [i,j][i,j] 操作用该操作之后 s[i,j]==t[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,请问是思路问题还是实现错误?

2024/7/14 10:20
加载中...