当前位置: 代码迷 >> 综合 >> codeforces 1512C A-B Palindrome
  详细解决方案

codeforces 1512C A-B Palindrome

热度:86   发布时间:2023-12-02 23:05:08.0

链接:

https://codeforces.com/problemset/problem/1512/C

题意:

给一个字符串长度为a+b,字符串质保函0,1,?,?可以替换成0或1,总共有a个0和b个1。问是否可以将字符串变成满足t[i]=t[n?i+1]形式的字符串。如果可以输出任意满足的字符串,如果不可以输出-1。

本题可以先计算除了固定的0和1,其余?还剩多少a和b,之后每次都看一半,先把一半是数字一半是?的对子配对成功,再将两边都是?的对子用剩余的a和b填充完即可。

代码如下:

#include<iostream>
#include<vector>
#include<cmath>
#include<map>
#include<algorithm>
#include<string>
#include<string.h>
#include<random>
using namespace std;
typedef long long ll;
int a[100003];
int main() {int T;cin >> T;while (T--) {int a, b;cin >> a >> b;string s;cin >> s;int len = s.size() / 2;bool f = true;for (int i = 0; i < s.size(); i++) {if (s[i] == '0') {a--;}else if (s[i] == '1') {b--;}}for (int i = 0; i < len; i++) {int rev = s.size() - i - 1;if (s[i] == '?'&&s[rev]!='?') {s[i] = s[rev];if (s[rev] == '0') {a--;}else {b--;}}else if (s[i] != '?' && s[rev] == '?') {s[rev] = s[i];if (s[i] == '0') {a--;}else {b--;}}else {if (s[i] != s[rev]) {f = false;break;}}}if (!f) {cout << -1 << endl;continue;}for (int i = 0; i < len; i++) {int rev = s.size() - i - 1;if (s[i] == '?') {if (a > 1) {s[i] = '0';s[rev] = '0';a -= 2;}else if (b > 1) {s[i] = '1';s[rev] = '1';b -= 2;}else {f = false;break;}}}if (s.size() & 1) {if (s[len] == '?') {if (a) {s[len] = '0';a--;}else if (b) {s[len] = '1';b--;}else {f = false;}}}if (a || b) {f = false;}if (!f) {cout << -1;}else {cout << s;}cout << endl;}return 0;
}