题意:
给一个长为n的01串s,如果可以构造出一个有x个1的01串l,使得s xor l的结果01串是回文的,就说x是好的。要求一个长为n+1的01串t,如果i是好的,那么第i位置为1,否则置为0(从第n位到第0位,共n+1位)
思路:
考虑如何把一个01串变为回文串,容易想到:
- 如果对称位置上不一致,那么一定且只能需要一个1
- 如果对称位置上一致,那么可以给0个或者2个1
- n为奇数,最中间位置上会留单个字符,这时可以给0或1个1
所以01串t的构造方式就很简单明了了,先统计出上述三种情况的个数,记为a1,a2,a3,先在第a1位置1,表示最少最少需要a1个1,t左移两位再与t,表示t表示的情况计算一次情况2,循环a2次即可,再算a3次情况3即可。
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <bitset>
using namespace std;
const int maxn=1e5+5;
int T,n;
string s;
bitset<maxn> ans;
int main(){
cin>>T;
while(T--){
cin>>n;
cin>>s;
int a1,a2,l;
a1=a2=l=0;a1=s.length()&1;
for(int i=0;i<(s.length()/2);i++){
if(s[i]!=s[s.length()-i-1])l++;
else a2++;
}
ans=1;
ans<<=l;
if(a1)ans|=(ans<<1);
for(int i=1;i<=a2;i++)ans|=(ans<<2);
for(int i=n;i>=0;i--)
cout<<ans[i];
puts("");
}
return 0;
}