// Original C++ solution (slower):
#include "bits/stdc++.h"

#include <ext/pb_ds/assoc_container.hpp>

#include <ext/pb_ds/tree_policy.hpp>



#ifdef on_linux

	#include <sys/resource.h>

#endif



#ifdef dobby_is_a_free_elf

	#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)

#else

	#define trace(...) 0;

#endif



using namespace std;

using namespace __gnu_pbds;



#define int                     long long

#define ll                      long long



#define fi                      first

#define sc                      second

#define mp                      make_pair

#define pb                      push_back

#define ppb                     pop_back

#define pf                      push_front

#define ppf                     pop_front

#define sqr(a)                  ((a) * (a))

#define lbd                     lower_bound

#define ubd                     upper_bound

#define sz(x)                   (int)((x).size())

#define all(x)                  (x).begin(), (x).end()

#define mem0(x)                 memset(x, 0, sizeof (x))

#define mem1(x)                 memset(x, -1, sizeof (x))

#define pii                     pair<int32_t, int32_t>

#define pll                     pair<long long, long long>



#define DECIMAL(n)              cout << fixed << setprecision(n);

#define rep(i,a,b)              for(int32_t i = (a); i < (b); ++i)

#define between(i,x,y)          ((i) >= (x) && (i) <= (y))

// #define clamp(i,x,y)            (((i) < (x)) ? (x) : ((y) < (i)) ? (y) : (i));



template<typename T, typename U> static inline void remax(T &x, U y) {if (x < y) {x = y;}}

template<typename T, typename U> static inline void remin(T &x, U y) {if (y < x) {x = y;}}



static mt19937_64 gen(chrono::duration_cast<chrono::nanoseconds>

                      (chrono::high_resolution_clock::now().time_since_epoch()).count());



template <typename T>

using ordered_set =

    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

// find_by_order(k)  returns iterator to kth element starting from 0;

// order_of_key(k) returns count of elements strictly smaller than k;

// erase, insert same as normal set



const long double PI = 3.14159265358979323846264338;

const double eps = 1e-10;

const int32_t fftmod = 998244353;

const int32_t MOD = 1000000007;

const long long INF = 1e18;

const int32_t N = 1e5 + 10;

const int32_t NN = 1e6 + 10;







inline void elf_magic(int testcase)

{

	int h, w;

	cin >> h >> w;

	string s[h];

	int cnt[26] = {};

	for (int i = 0; i < h; ++i) {

		cin >> s[i];

		for (char c : s[i]) { cnt[c - 'a']++; }

	}



	// checked

	if (h % 2 == 0 && w % 2 == 0) {

		for (int x : cnt) {

			if (x % 4) {

				cout << "No";

				return;

			}

		}

		cout << "Yes";

		return;

	}

	// checked



	if (h % 2 && w % 2 == 0) { swap(h, w); }

	if (h % 2 == 0 && w % 2) {

		int rem = 0;

		for (int x : cnt) {

			if (x % 2) {

				cout << "No";

				return;

			}

			rem += x % 4;

		}

		if (rem > h) {

			cout << "No";

		}

		else {

			cout << "Yes";

		}

		return;

	}

	int rem = 0, ctr = 0;

	for (int x : cnt) {

		if (x % 2) {

			ctr++;

		}

		rem += x % 4;

	}

	if (rem > h + w - 1 || ctr != 1) {

		cout << "No";

	} else {

		cout << "Yes";

	}



	return;

}



int32_t main()

{

	#ifdef on_linux

	rlimit cpu_time {.rlim_cur = 2, .rlim_max = RLIM_INFINITY};

	setrlimit(RLIMIT_CPU, &cpu_time);

	#endif



	ios_base::sync_with_stdio(false);

	cin.tie(nullptr);

	cout.tie(nullptr);



	int TESTS = 1;

	//cin >> TESTS;

	for (int i = 1; i <= TESTS; ++i) {

		// cout << "Case #" << i << ": ";

		elf_magic(i);

		if (i != TESTS)	{ cout << '\n'; }

	}

	return 0;

}

// Optimized solution to the same problem (faster):
#include <cstdio>



char str[110][110];

int ct[130];



int main() {

	int n, m;

	scanf("%d%d", &n, &m);

	for (int i = 0; i < n; ++i)

		scanf("%s", str + i);

	for (int i = 0; i < n; ++i)

		for (int j = 0; j < m; ++j)

			++ct[str[i][j]];

	bool flag = 1;

	if (n % 2 == 0 && m % 2 == 0) {

		for (int i = 0; i < 130; ++i)

			if (ct[i] % 4)

				flag = 0;

	}

	else if (n % 2 == 0 || m % 2 == 0) {

		int cA = 0;

		for (int i = 0; i < 130; ++i)

			if (ct[i] % 4) {

				if (ct[i] % 4 != 2)

					flag = 0;

				++cA;

			}

		if (m % 2 == 0 && cA > m / 2 || n % 2 == 0 && cA > n / 2) flag = 0;

	}

	else {

		int cA = 0, cB = 0;

		for (int i = 0; i < 130; ++i)

			if (ct[i] % 4) {

				if (ct[i] % 4 == 3) ++cA, ++cB;

				if (ct[i] % 4 == 1) ++cA;

				else ++cB;

			}

		if (cA != 1 || cB > m / 2 + n / 2) flag = 0;

	}

	puts(flag ? "Yes" : "No");

	return 0;

}


// Fastest known solution for this problem: