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<bits/stdc++.h>
using namespace std;
int main(){
  int h,w;cin>>h>>w;
  string a[h];
  for(int i=0;i<h;i++)cin>>a[i];
  vector<int> cnt(26);
  for(int i=0;i<26;i++) cnt[i]=0;
  for(int i=0;i<h;i++){
    for(int j=0;j<w;j++){
      int x=a[i][j]-'a';
      cnt[x]++;
    }
  }
  sort(cnt.begin(),cnt.end());
  if(h%2==1&&w%2==1){
    for(int i=0;i<(h-1)/2;i++){
      for(int j=0;j<26;j++){
        if(cnt[25]<2){
          cout<<"No"<<endl;
          return 0;
        }
        if(cnt[j]>=2){
          cnt[j]-=2;
          sort(cnt.begin(),cnt.end());
          break;
        }
      }
      for(int j=0;j<(w-1)/2;j++){
        if(cnt[25]>=4){
          cnt[25]-=4;
          sort(cnt.begin(),cnt.end());
        }
        else{
          cout<<"No"<<endl;
          return 0;
        }
      }
    }
    int on=0;
    for(int i=0;i<26;i++){
      if(cnt[i]%2==1) on++;
    }
    if(on==1){
      cout<<"Yes"<<endl;
      return 0; 
    }
    else{
      cout<<"No"<<endl;
      return 0; 
    }
  }
  if(h%2==1&&w%2==0){
    for(int i=0;i<(h-1)/2;i++){
      for(int j=0;j<w/2;j++){
        if(cnt[25]>=4){
          cnt[25]-=4;
          sort(cnt.begin(),cnt.end());
        }
        else{
          cout<<"No"<<endl;
          return 0;
        }
      }
    }
    int on=0;
    for(int i=0;i<26;i++){
      if(cnt[i]%2==1) on++;
    }
    if(on==0){
      cout<<"Yes"<<endl;
      return 0; 
    }
    else{
      cout<<"No"<<endl;
      return 0; 
    }
  }
  if(h%2==0&&w%2==1){
    for(int i=0;i<h/2;i++){
      for(int j=0;j<26;j++){
        if(cnt[25]<2){
          cout<<"No"<<endl;
          return 0;
        }
        if(cnt[j]>=2){
          cnt[j]-=2;
          sort(cnt.begin(),cnt.end());
          break;
        }
      }
      for(int j=0;j<(w-1)/2;j++){
        if(cnt[25]>=4){
          cnt[25]-=4;
          sort(cnt.begin(),cnt.end());
        }
        else{
          cout<<"Yes"<<endl;
          return 0;
        }
      }
    }
    cout<<"No"<<endl;
    return 0; 
  }
  if(h%2==0&&w%2==0){
    for(int i=0;i<h/2;i++){
      for(int j=0;j<w/2;j++){
        if(cnt[25]>=4){
          cnt[25]-=4;
          sort(cnt.begin(),cnt.end());
        }
        else{
          cout<<"No"<<endl;
          return 0;
        }
      }
    }
    cout<<"Yes"<<endl;
    return 0; 
  }
}