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: Wrong Answer)

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <numeric>
#include <bitset>

using namespace std;
using ll = long long;
using ld = long double;
const ll mod =  1000000007;

#define REP(i, n) for (ll i = 0; i < (n); ++i)
#define REP_FROM(i, j, n) for (ll i = (j); i < (n); ++i)
#define all(x) (x).begin(),(x).end()

ll power(ll base, ll exponent, ll module){ if(exponent % 2){ return power(base, exponent - 1, module) * base % module; }else if(exponent){ ll root_ans = power(base, exponent / 2, module); return root_ans * root_ans % module; }else{ return 1; }}
ll inverse(ll x){ return power(x, mod - 2, mod);}
ll gcd(ll a, ll b) {if(a < b) gcd(b, a);ll r;while(r=a%b) {a=b;b=r;}return b;}
struct combination{ vector<ll> fact, inv; combination(int sz) : fact(sz + 1), inv(sz + 1){ fact[0] = 1; for(int i = 1; i <= sz; i++){ fact[i] = fact[i - 1] * i % mod; } inv[sz] = power(fact[sz], mod - 2, mod); for(int i = sz - 1; i >= 0; i--){ inv[i] = inv[i + 1] * (i + 1) % mod; } } ll C(int p, int q) const{ if(q < 0 || p < q) return 0; return (fact[p] * inv[q] % mod * inv[p - q] % mod); } };

int bsearch(const vector<ll>& a, ll x){
  int lft = 0;
  int rgt = a.size();
  while (rgt - lft > 1) {
    int mid = (lft + rgt) / 2;
    if(a[mid] < x) {
      lft = mid;
    }
    else {
      rgt = mid;
    }
  }
  return lft;
}


signed main() {
  ios::sync_with_stdio(false);
  ll h, w;
  cin >> h >> w;
  map<char, int> a;
  REP(i, h) {
    string s;
    cin >> s;
    REP(j, w) {
      if(a.count(s[j])) {
        a[s[j]]++;
      }
      else {
        a[s[j]] = 1;
      }
    }
  }
  int b[] = {0, 0, 0, 0};
  REP_FROM(i, 'a', 'z'+1) {
    if(a.count(i)) {
      b[a[i]%4]++;
    }
  }
  if(h*w==1){
    cout << "Yes" << endl;
    return 0;
  }
  if(h == 1 || w == 1) {
    if((h % 2 == 1 || w % 2 == 1) && (b[1] == 1 || b[3] == 1)) {
      cout << "Yes" << endl;
    }
    else if(b[1] == 0 && b[3] == 0) {
      cout << "Yes" << endl;
    }
    else {
    cout << "No" << endl;
    }
    return 0;   
  }
  // cout << b[0] << b[1] << b[2] << b[3] << endl;
  if(h == 2 & w == 2) {
    if(b[0] == 1) {
      cout << "Yes" << endl;
    }
    else {
      cout << "No" << endl;
    }
    return 0;
  }
  if(h == 2 || w == 2) {
    if(b[1] == 0 || b[3] == 0) {
      cout << "No" << endl;
    }
    else if((h % 2 == 1 || w % 2 == 1) && b[2] == 1) {
      cout << "Yes" << endl;
    }
    else if(b[2] == 0) {
      cout << "Yes" << endl;
    }
    else {
      cout << "No" << endl;
    }
    return 0;
  }
  if(h % 2 == 1 && w % 2 == 1) {
    if(b[3] == 1) {
      b[1]++;
      b[2]++;
      b[3] = 0;
    }
    if(b[1] == 1 && b[2] <= (h%2==1?w/2:h/2) && b[3] == 0) {
      cout << "Yes" << endl;
    }
    else {
      cout << "No" << endl;
    }
    return 0;
  }
  if(h % 2 == 1 || w % 2 == 1) {
    if(b[1] == 0 && b[2] <= (h%2==1?w/2:h/2) && b[3] == 0) {
      cout << "Yes" << endl;
    }
    else {
      cout << "No" << endl;
    }
    return 0;
  }
  // even * even
  {
    if(b[1] == 0 && b[2] == 0 && b[3] == 0) {
      cout << "Yes" << endl;
    }
    else {
      cout << "No" << endl;
    }
  }
  return 0;
}