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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UncheckedIOException;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
	static int[][] ans;
	static int alphabet=26;
	public static void main(String[] args) {
		SC sc = new SC(System.in);
		int H=sc.nextInt();
		int W=sc.nextInt();
		int[] cha=new int[alphabet];
		ans=new int[H][W];
		Arrays.fill(cha, 0);
		for(int i=0; i<H; i++) {
			String a=sc.next();
			for(int j=0; j<W; j++) {
				cha[a.charAt(j)-'a']++;
			}
		}
		if(H%2==1 && W%2==1) {//奇数ｘ奇数
			boolean kisu=false;
			for(int i=0; i<alphabet; i++) {
				if(!kisu && cha[i]%2==1) {
					kisu=true;
				}
				else if(kisu && cha[i]%2==1) {
					pl("No");
					System.exit(0);
				}
			}
			int make4=(H/2)*(W/2);
			for(int i=0; i<alphabet; i++) {
				if(cha[i]>=4) {
					make4-=cha[i]/4;
				}
			}
			if(make4>0) {
				pl("No");
				System.exit(0);
			}
			//ここまで来たならOK
			pl("Yes");
		}
		else if(H%2==0 && W%2==0) {//偶数ｘ偶数
			for(int i=0; i<alphabet; i++) {
				if(cha[i]%4!=0) {
					pl("No");
					System.exit(0);
				}
			}
			//ここまで来たならOK
			pl("Yes");
		}
		else {
			if(H%2==1) {
				int make4=((H-1)/2)*(W/2);
				for(int i=0; i<alphabet; i++) {
					if(cha[i]>=4) {
						make4-=cha[i]/4;
					}
					if(cha[i]%2==1) {
						pl("No");
						System.exit(0);
					}
				}
				if(make4>0) {
					pl("No");
					System.exit(0);
				}
				//ここまで来たならOK
				pl("Yes");
			}
			else if(W%2==1) {
				int make4=(H/2)*((W-1)/2);
				for(int i=0; i<alphabet; i++) {
					if(cha[i]>=4) {
						make4-=cha[i]/4;
					}
					if(cha[i]%2==1) {
						pl("No");
					}
				}
				if(make4>0) {
					pl("No");
					System.exit(0);
				}
				//ここまで来たならOK
				pl("Yes");
			}
		}
	}
	static class SC {
		private BufferedReader reader = null;
		private StringTokenizer tokenizer = null;
		public SC(InputStream in) {
			reader = new BufferedReader(new InputStreamReader(in));
		}
		public String next() {
			if (tokenizer == null || !tokenizer.hasMoreTokens()) {
				try {
					tokenizer = new StringTokenizer(reader.readLine());
				} catch (IOException e) {
					throw new UncheckedIOException(e);
				}
			}
			return tokenizer.nextToken();
		}
		public int nextInt() {
			return Integer.parseInt(next());
		}
		public long nextLong() {
			return Long.parseLong(next());
		}
		public double nextDouble() {
			return Double.parseDouble(next());
		}
		public String nextLine() {
			try {
				return reader.readLine();
			} catch (IOException e) {
				throw new UncheckedIOException(e);
			}
		}
	}
	public static void pl(Object o) {
		System.out.println(o);
	}
	public static void pl() {
		System.out.println();
	}
	public static void p(Object o) {
		System.out.print(o);
	}
}