QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#771601 | #8058. Binary vs Ternary | yuanruiqi# | WA | 0ms | 3724kb | C++14 | 2.9kb | 2024-11-22 14:30:19 | 2024-11-22 14:30:21 |
Judging History
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)