Problem:
Score : 400 points

Problem Statement

We have an H-by-W matrix.
Let a_{ij} be the element at the i-th row from the top and j-th column from the left.
In this matrix, each a_{ij} is a lowercase English letter.

Snuke is creating another H-by-W matrix, A', by freely rearranging the elements in A.
Here, he wants to satisfy the following condition:

Every row and column in A' can be read as a palindrome.

Determine whether he can create a matrix satisfying the condition.

Note

A palindrome is a string that reads the same forward and backward.
For example, a, aa, abba and abcba are all palindromes, while ab, abab and abcda are not.

Constraints

1 ≤ H, W ≤ 100

a_{ij} is a lowercase English letter.

Input

Input is given from Standard Input in the following format:

H W
a_{11}a_{12}...a_{1W}
:
a_{H1}a_{H2}...a_{HW}

Output

If Snuke can create a matrix satisfying the condition, print Yes; otherwise, print No.

Sample Input 1

3 4
aabb
aabb
aacc

Sample Output 1

Yes

For example, the following matrix satisfies the condition.

abba
acca
abba

Sample Input 2

2 2
aa
bb

Sample Output 2

No

It is not possible to create a matrix satisfying the condition, no matter how we rearrange the elements in A.

Sample Input 3

5 1
t
w
e
e
t

Sample Output 3

Yes

For example, the following matrix satisfies the condition.

t
e
w
e
t

Sample Input 4

2 5
abxba
abyba

Sample Output 4

No

Sample Input 5

1 1
z

Sample Output 5

Yes

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>

#define rep(i,n) for(int i=0; i<(n); i++)
#define reps(i,x,n) for(int i=x; i<(n); i++)
#define rrep(i,n) for(int i=(n)-1; i>=0; i--)
#define all(X) (X).begin(),(X).end()
#define X first
#define Y second
#define pb push_back
#define eb emplace_back

using namespace std;
typedef long long int ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }

template<class A, size_t N, class T> void Fill(A (&a)[N], const T &v){ fill( (T*)a, (T*)(a+N), v ); }

const ll INF = 1e9+7;


int main(){
	//ios_base::sync_with_stdio(0);
	int H, W;
	char a[105][105];
	int cnt[255]={};

	cin >> H >> W;
	rep(i,H) rep(j,W){
		cin >> a[i][j];
		cnt[ a[i][j]-'a' ]++;
	}

	if( H > W ) swap(H, W);

	bool ans = false;
	if( H == 1 && W == 1 ) ans = true;
	if( H == 1 ){
		int odd=0;
		rep(i,30) if(cnt[i] % 2) odd++;
		if( W % 2 == 0 ){
			ans = (odd == 0);
		}else{
			ans = (odd == 1);
		}
	}else if( H % 2 == 0 ){
		int c[5]={};
		rep(i,26){
			if(cnt[i] % 4 == 0) c[4]++;
			else if( cnt[i] % 2 == 0 ) c[2]++;
			else c[1]++;
		}
		if( W % 2 == 0 ){
			ans = (c[1] == 0 && c[2] == 0);
		}else{
			ans = (c[1] == 0 && c[2] <= H/2);
		}
	}else{
		int c[5]={};
		rep(i,26){
			if(cnt[i] % 4 == 0) c[4]++;
			else if( cnt[i] % 2 == 0 ) c[2]++;
			else c[1]++;
		}
		if( W % 2 == 0 ){
			ans = (c[1] == 0 && c[2] <= W/2);
		}else{
			ans = (c[1] == 1 && c[2] <= W/2 + H/2);
			//rep(i,26){
			//	if(cnt[i] % 4 == 0) cnt[i] %= 4;
			//}
		}
	}

	cout << (ans?"Yes":"No") << endl;

	return 0;
}