我菜就多练…
题目链接
题目大意
给定长度为
n
n
n的
01
01
01串
p
p
p
定义
x
x
x为好数:找到一个长度为
n
n
n的
01
01
01串
s
s
s,其中含有
x
x
x个
1
1
1,使
p
p
p和
s
s
s逐位异或,得到一个回文串
你需要输出一个长度为
n
+
1
n+1
n+1的串,针对第
y
y
y位,如果存在好数
y
y
y则输出1,如果不存在则输出
0
0
0
思路
显然最低满足要把所有不对称的改过来
分奇偶讨论
当
n
n
n为偶数,我们观察本来已经对称的字符,每一对字符贡献为
2
2
2
当
n
n
n为奇数,除了上述贡献以外,我们发现中位字符对合法的每次答案贡献是
1
1
1或
0
0
0
ACcode
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n;cin >> n;
string str;cin >> str;
int ret = 0;//不同的对数
for (int i = 0;i < n / 2;i++)if (str[i] != str[n - 1 - i])ret++;
for (int i = 0;i <= n;i++) {
if (i < ret) {
cout << 0;
continue;
}
int tmp = i - ret;
if (!tmp) {
cout << 1;
continue;
}
if (n % 2) {//奇数
if (tmp % 2)tmp--;
if (tmp <= (n - 1) - ret * 2)cout << 1;
else cout << 0;
}
else {//偶数个
if (tmp % 2 == 0 && tmp <= n - ret * 2)cout << 1;
else cout << 0;
}
}
cout << '\n';
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}