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 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<stdbool.h>
typedef long long ll;
typedef long double ld;
#define rep(i,l,r)for(ll i=(l);i<(r);i++)
#define repp(i,l,r,k)for(ll i=(l);i<(r);i+=(k))
#define rrep(i,l,r)for(ll i=(l);i>=(r);i--)
#define INF (1LL<<60)
#define MOD1 1000000007
#define MAX_N (1 << 17)


void swap(ll *a, ll *b){ll c;c=*b;*b=*a;*a=c;}
ll max2(ll a,ll b){return a>=b?a:b;}
ll min2(ll a,ll b){return a>=b?b:a;}
ll minn(ll n, ll a[n]){ll b=INF;rep(i,0,n) b=min2(b,a[i]);return b;}
ll maxn(ll n, ll a[n]){ll b=-INF;rep(i,0,n) b=max2(b,a[i]);return b;}
ll ABS(ll a){return a>=0?a:(-a);}
ll POW(ll a, ll b){ll c=1;rep(i,0,b) c*=a;return c;}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
int upll(const void*a, const void*b){return*(ll*)a<*(ll*)b?-1:*(ll*)a>*(ll*)b?1:0;}
int downll(const void*a, const void*b){return*(ll*)a<*(ll*)b?1:*(ll*)a>*(ll*)b?-1:0;}
void sortup(ll*a,int n){qsort(a,n,sizeof(ll),upll);}
void sortdown(ll*a,int n){qsort(a,n,sizeof(ll),downll);}

#define YES printf("Yes\n")
#define NO printf("No\n")

typedef struct{
    ll aa;
    ll bb;
}frequent;

int main(void){
    char s[105][105];
    ll h,w;
    scanf("%lld%lld",&h,&w);
    ll cnt[26]={};
    rep(i,0,h){
        scanf("%s",s[i]);
        rep(j,0,w){
            cnt[(ll)s[i][j]-97]++;
        }
    }
    
    if(h%2==0&&w%2==0){
        rep(i,0,26){
            if(cnt[i]%4!=0){
                NO;
                return 0;
            }
        }
        YES;
        return 0;
    }


    if(h*w%2==1){
        ll a=0,b=0,c=0;
        rep(i,0,26){
            if(cnt[i]%4==1){a++;}
            if(cnt[i]%4==2){b++;}
            if(cnt[i]%4==3){c++;}
        }
        
        if(a==1){
            if(c!=0){
                NO;
            }else{
                if(b%2==(h/2+w/2)%2 ){
                    YES;
                }else{
                    NO;
                }
            }
        }else{
            if(c!=1){
                NO;
            }else{
                if( (b+1)%2 == (h/2+w/2)%2){
                    YES;
                }else{
                    NO;
                }
            }
        }
    }


    if( h*w%2==0  && (h+w)%2==1 ){
        ll a=0,b=0,c=0;
        rep(i,0,26){
            if(cnt[i]%4==1){a++;}
            if(cnt[i]%4==2){b++;}
            if(cnt[i]%4==3){c++;}
        }
        // printf("b%lld\n",b);
        if(a!=0 || c!=0){
            NO;
        }else{
            if( b%2 == ( (h%2) ? (w/2%2) : (h/2%2) ) ){
                YES;
            }else{
                NO;
            }
        }
    }
    // rep(i,0,26){
    //     printf("%c%lld ",(char)i+97,cnt[i]);
    // }
    // printf("\n");
    return 0;
}