QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#771601#8058. Binary vs Ternaryyuanruiqi#WA 0ms3724kbC++142.9kb2024-11-22 14:30:192024-11-22 14:30:21

Judging History

你现在查看的是最新测评结果

  • [2024-11-22 14:30:21]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3724kb
  • [2024-11-22 14:30:19]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
using pii = pair<int, int>;
vector<pii> ans;
void add(string& s, int l, int r, int x)
{
    if (l > r || l == r) return;
    ans.emplace_back(pii(l + x, r + x));
    string t = s.substr(l, r - l + 1);
    s.erase(s.begin() + l + 1, s.begin() + r + 1);
    if (t[0] != '0')
    {
        s.erase(s.begin() + l);
        if (t == "10") s.insert(s.begin() + l, '1'), s.insert(s.begin() + l, '1');
        else if (t == "11") s.insert(s.begin() + l, '0'), s.insert(s.begin() + l, '0'), s.insert(s.begin() + l, '1');
        else assert(0);
    }
}
void mak(string& s, int l, int x)
{
    // 111111
    add(s, 0, 1, x); // 1001111
    if (l == 1) return add(s, 1, 2, x);
    if (l == 2) return;
    for (int i=2;i<l;++i)
    {
        add(s, 0, 1, x); // 1101111
        add(s, 0, 1, x); // 10001111
    }
}
void run(string s, string t, int x)
{
    assert(s == "11");
    assert(t.front() == '1');
    if (s == t) return;
    if (t[1] == '1')
    {
        assert(t.size() > 2);
        add(s, 0, 1, x);
        add(s, 0, 1, x);
        add(s, 1, 2, x);
        s.erase(s.begin());
        t.erase(t.begin());
        return run(s, t, x + 1);
    }
    // if (t.size() == 2)
    // {
    //     add(s, 0, 1, x);
    //     add(s, 1, 2, x);
    //     assert(s == t);
    //     return;
    // }
    int l = 0;
    while (l + 1 < t.size() && t[l + 1] == '0') ++l;
    if (l + 1 == t.size())
    {
        mak(s, l, x);
        assert(s == t);
        return;
    }
    else if (l + 2 == t.size())
    {
        add(s, 0, 1, x);
        add(s, 0, 1, x);
        add(s, 1, 2, x);
        mak(s, l, x);
        assert(s == t);
        return;
    }
    else
    {
        add(s, 0, 1, x);
        add(s, 0, 1, x);
        add(s, 1, 2, x);
        add(s, 1, 2, x);
        add(s, 1, 2, x);
        add(s, 2, 3, x);
        assert(s == "1111");
        mak(s, l, x);
        string ss = s.substr(l + 1, s.size() - l - 1);
        string tt = t.substr(l + 1, t.size() - l - 1);
        return run(ss, tt, x + l + 1);
    }
}
void solve()
{
    string s, t;
    cin >> s >> t;
    if (s == t) return cout << "0\n", void();
    if (s == "1") return cout << "-1\n", void();
    ans.clear();
    for (int i=1;i+1<s.size();++i)
        while (i + 1 < s.size() && s[i] == '0') add(s, i, i + 1, 1);
    while (s.size() > 2)
    {
        int n = s.size();
        if (s.back() == '0') add(s, n - 3, n - 2, 1);
        else add(s, n - 2, n - 1, 1);
        int r = n - 1;
        while (s[r] == '0') --r;
        add(s, r + 1, s.size() - 1, 1);
    }
    if (s == "10") add(s, 0, 1, 1);
    run(s, t, 1);
    cout << ans.size() << '\n';
    for (auto [x, y] : ans) cout << x << ' ' << y << '\n';
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t;
    cin >> t;
    while (t--) solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3724kb

input:

3
1
111
110110
1101010
1111
111111

output:

-1
27
3 4
3 4
3 4
1 2
2 4
1 2
1 2
1 2
2 3
2 3
2 3
3 4
3 4
3 4
4 5
2 3
3 4
4 5
4 5
5 6
5 6
5 6
6 7
4 5
5 6
6 7
7 8
19
3 4
4 5
2 3
3 5
1 2
2 4
1 2
1 2
1 2
2 3
2 3
2 3
3 4
3 4
3 4
4 5
4 5
4 5
5 6

result:

wrong answer (l,r) is invalid (test case 2)