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: Accepted)

#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 内部定数
#define D_CHAR_CNT		26										// 文字種類数

// 内部変数
static FILE *szpFpI;											// 入力
static int siH, siW;											// 幅・高さ
static int si1CCnt[D_CHAR_CNT];									// 各文字数
static int siGrp2;												// ２文字グループ数
static int siGrp4;												// ４文字グループ数

// 内部変数 - テスト用
#ifdef D_TEST
	static int siRes;
	static FILE *szpFpA;
#endif

// グループ数 - セット
int
fSetGrp(
	int piH						// <I> 高さ
	, int piW					// <I> 幅
)
{
	// 高さが１
	if (piH == 1) {
		siGrp2 += piW / 2;		// ２文字グループ数
		return 0;
	}

	// 高さが奇数
	if (piH % 2 == 1) {
		fSetGrp(1, piW);
		piH--;
	}

	// 幅が奇数
	if (piW % 2 == 1) {
		fSetGrp(1, piH);
		piW--;
	}

	// ４文字グループ数
	siGrp4 += (piH * piW) / 4;

	return 0;
}

// 判定 - グループ単位
int
fJudgeGrp(
	int piGCnt					// <I> グループ数
	, int piDel					// <I> 減算値
)
{
	int liCNo = 0;
	while (piGCnt > 0) {
		while (1) {
			if (liCNo >= D_CHAR_CNT) {
				return -1;
			}
			if (si1CCnt[liCNo] >= piDel) {
				si1CCnt[liCNo] -= piDel;
				break;
			}
			else {
				liCNo++;
			}
		}

		piGCnt--;
	}

	return 0;
}

// 判定
int
fJudge(
)
{
	int liRet;

	// ４文字グループ数
	liRet = fJudgeGrp(siGrp4, 4);
	if (liRet != 0) {
		return -1;
	}

	// ２文字グループ数
	liRet = fJudgeGrp(siGrp2, 2);
	if (liRet != 0) {
		return -1;
	}

	return 0;
}

// 実行メイン
int
fMain(
	int piTNo					// <I> テスト番号 1～
)
{
	int i, j;
	char lc1Buf[1024], lc1Out[1024];

	// データ - 初期化
	memset(si1CCnt, 0, sizeof(si1CCnt));						// 各文字数
	siGrp2 = 0;													// ２文字グループ数
	siGrp4 = 0;													// ４文字グループ数

	// 入力 - セット
#ifdef D_TEST
	sprintf(lc1Buf, ".\\Test\\T%d.txt", piTNo);
	szpFpI = fopen(lc1Buf, "r");
	sprintf(lc1Buf, ".\\Test\\A%d.txt", piTNo);
	szpFpA = fopen(lc1Buf, "r");
	siRes = 0;
#else
	szpFpI = stdin;
#endif

	// 幅・高さ - 取得
	fgets(lc1Buf, sizeof(lc1Buf), szpFpI);
	sscanf(lc1Buf, "%d%d", &siH, &siW);

	// 各文字数 - 取得
	for (i = 0; i < siH; i++) {
		fgets(lc1Buf, sizeof(lc1Buf), szpFpI);
		for (j = 0; j < siW; j++) {
			si1CCnt[lc1Buf[j] - 'a']++;
		}
	}

	// グループ数 - セット
	fSetGrp(siH, siW);

	// 判定
	int liRet = fJudge();

	// 結果 - セット
	if (liRet == 0) {
		sprintf(lc1Out, "Yes\n");
	}
	else {
		sprintf(lc1Out, "No\n");
	}

	// 結果 - 表示
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, lc1Out)) {
		siRes = -1;
	}
#else
	printf("%s", lc1Out);
#endif

	// 残データ有無
#ifdef D_TEST
	lc1Buf[0] = '\0';
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, "")) {
		siRes = -1;
	}
#endif

	// テストファイルクローズ
#ifdef D_TEST
	fclose(szpFpI);
	fclose(szpFpA);
#endif

	// テスト結果
#ifdef D_TEST
	if (siRes == 0) {
		printf("OK %d\n", piTNo);
	}
	else {
		printf("NG %d\n", piTNo);
	}
#endif

	return 0;
}

int
main()
{

#ifdef D_TEST
	int i;
	for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
		fMain(i);
	}
#else
	fMain(0);
#endif

	return 0;
}