QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#894013 | #1289. A + B Problem | ywli08 | RE | 0ms | 0kb | C++14 | 1.7kb | 2025-02-11 10:42:34 | 2025-02-11 10:42:46 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e6+5;
int T;
int n, m;
string s;
ll pre[maxn];
ll id[maxn];
string add(string a, string b){
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
while(a.size() < b.size()) a += '0';
while(b.size() < a.size()) b += '0';
string c = ""; int r = 0;
for(int i = 0;i < a.size() && i < b.size();i++){
c += '0' + (a[i] - '0' + b[i] - '0' + r) % 2;
r = (a[i] - '0' + b[i] - '0' + r) / 2;
}
if(r) c += r + '0';
while(c.size() > 1 && c.back() == '0') c.pop_back();
reverse(c.begin(), c.end());
return c;
}
void _main(){
cin >> n >> m;
if(n > m) swap(n, m);
cin >> s;
s = ' ' + s;
int cnt[2] = {0, 0};
for(int i = 1;i <= n + m;i++){
cnt[s[i] - '0'] ++;
pre[i] = cnt[1];
if(s[i] == '1') id[cnt[1]] = i;
}
string a = "", b = "";
int ca = 0, cb = 0;
for(int i = 1;i <= n + m;i++){
int diff = (m - (int)b.size()) - (n - (int)a.size());
if(a.size() < n && (s[i] == '0' ||
(s[i] == '1' && id[pre[i] + diff + 1] && (id[pre[i] + diff + 1] - i - (diff + 1) <= (ll)(n - a.size() - 1))))){
a += s[i]; ca += s[i] == '1';
}
else b += s[i], cb += s[i] == '1';
if(n - a.size() > m - b.size()) swap(n, m), swap(a, b);
}
cerr << a << ' ' << b << endl;
cout << add(a, b) << endl;
for(int i = 1;i <= n + m;i++){
id[i] = pre[i] = 0;
}
}
int main(){
freopen("partition.in", "r", stdin);
freopen("partition.out", "w", stdout);
cin >> T;
while(T--){
_main();
}
}
詳細信息
Test #1:
score: 0
Dangerous Syscalls
input:
3 4 3 1000101 2 2 1111 1 1 00