Codeforces 1251B Binary Palindromes
思路:
1.n个字符串,我们一定可以创造出n-1个回文串,我们只需要判断最后一个能否成为回文串即可;
2.字符串分为两种:奇数长度的和偶数长度的,其中奇数长度的一定是由奇数个0/1
加上偶数个0/1
,偶数长度的一定是由偶数个数的0和1相加;
3.在最开始统计此次所有字符串0的总和的奇偶性zero
和1的总和的奇偶性one
(值为1代表奇数,0代表偶数),同时计算出奇数长度串的个数,每有一个奇数串,对zero
和one
做出变化,最后判断zero
和one
是否都为0即可;
代码:
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> p;
typedef long long ll;
#define isOp(x,y) ((x^y)<0)
#define mem(a,x) memset(a,x,sizeof(a))
#define m_p(a,b) make_pair(a,b)
#define p_b(a) push_back(a)
#define rp(i,n) for(int i=0;i<n;i++)
#define rpn(i,n) for(int i=1;i<=n;i++)
#define l_b(a,n,x) lower_bound(a,a+n,x)-a
#define u_b(a,n,x) upper_bound(a,a+n,x)-a
int main(){
IOS;
int q;
cin>>q;
rp(i,q){
int n;
cin>>n;
int odd_n=0,even_n=0;//统计奇数长度和偶数长度的字符串个数
bool one=false,zero=false;//false为偶 true为奇
rp(j,n){
string s;
cin>>s;
if(s.length()%2) odd_n++;
else even_n++;
for(auto e:s){
if(e=='1') one=!one;
else zero!=zero;
}
}
while(odd_n--){
if(one) one=!one;
else zero!=zero;
}
if(!one&&!zero) cout<<n<<'\n';
else cout<<n-1<<'\n';
}
return 0;
}