QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#771633 | #8058. Binary vs Ternary | yuanruiqi# | RE | 0ms | 3560kb | C++14 | 3.1kb | 2024-11-22 14:45:02 | 2024-11-22 14:45:02 |
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);
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;
}
詳細信息
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 ...