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>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<pii,int> piii;
typedef pair<ll,ll> pll;

#define reps(i,f,n) for(int i = int(f); i <= int(n); i++)
#define rep(i,n) reps(i,0,int(n)-1)
#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 sz size()
#define eb emplace_back
#define pb push_back

int memo[32];

int main(void){
  int w, h;
  int ok = false;

  cin >> h >> w;
  string str;
  rep(i,h){
    cin >> str;
    rep(j, w){
      memo[str[j]-'a']++;
    }
  }

  if(h < w) swap(h,w);
  if(w == 1){
    int o = 0;
    if(h%2 == 1){
      o = 1;
    }
    rep(i, 26){
      if(memo[i] %2 == 1){
        o--;
      }
    }
    if(o == 0){
      ok = true;
    }
  }else{
    int o = 0;
    int to = 0;
    if(h%2 == 1 && w %2 == 1){
      //2 -> 2, 1->1
      o = 1;
      to = h/2 + w/2;
    }else if(h%2 == 1 || w%2 ==1){
      if(h%2 == 1) to = w/2;
      else to = h/2;
    }
    rep(i, 26){
      if(memo[i] %4 != 0){
        if(memo[i] %2 == 1){
          o--;
        }else{
          to--;
        }
      }
    }
    if( o == 0 && to == 0){
      ok = true;
    }
  }
  if(ok) cout << "Yes" << endl;
  else cout << "No" << endl;
}