Codeforces 1251B Binary Palindromes

思路:

1.n个字符串,我们一定可以创造出n-1个回文串,我们只需要判断最后一个能否成为回文串即可;
2.字符串分为两种:奇数长度的和偶数长度的,其中奇数长度的一定是由奇数个0/1加上偶数个0/1,偶数长度的一定是由偶数个数的0和1相加;
3.在最开始统计此次所有字符串0的总和的奇偶性zero和1的总和的奇偶性one(值为1代表奇数,0代表偶数),同时计算出奇数长度串的个数,每有一个奇数串,对zeroone做出变化,最后判断zeroone是否都为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;
}
posted @ 2019-11-07 12:32  YuhanのBlog  阅读(103)  评论(0编辑  收藏  举报