QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#771633#8058. Binary vs Ternaryyuanruiqi#RE 0ms3560kbC++143.1kb2024-11-22 14:45:022024-11-22 14:45:02

Judging History

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

  • [2024-11-22 14:45:02]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:3560kb
  • [2024-11-22 14:45:02]
  • 提交

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);
    if (t == string(t.size(), '0')) s.erase(s.begin() + l + 1, s.begin() + r + 1);
    else
    {
        assert(t.size() <= 2);
        if (t[0] == '0') s.erase(s.begin() + l);
        if (t[0] != '0')
        {
            s.erase(s.begin() + l, s.begin() + r + 1);
            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: 100
Accepted
time: 0ms
memory: 3560kb

input:

3
1
111
110110
1101010
1111
111111

output:

-1
29
3 4
3 4
4 6
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
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:

ok Haitang Suki (3 test cases)

Test #2:

score: -100
Runtime Error

input:

1000
11100
111
1
11110
10001
10
1011
1111
10
1110
1100
11
11010
11
110
11
1
10001
10110
10
10
11111
10000
1001
10
1
11
10111
11
10
1
100
11
10100
1
10
101
11
1100
110
11
1110
1
1001
1
11111
10
10010
10
11001
110
1010
10011
1110
10100
1001
1001
101
100
1
1001
11
101
11
101
1001
1
1
1011
1
10
10
1011
...

output:


result: