← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

const MOD = 998244353

func power(base, exp int64) int64 {
	res := int64(1)
	base %= MOD
	for exp > 0 {
		if exp%2 == 1 {
			res = (res * base) % MOD
		}
		base = (base * base) % MOD
		exp /= 2
	}
	return res
}

func inverse(n int64) int64 {
	return power(n, MOD-2)
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n, m int
	fmt.Fscan(reader, &n, &m)

	var aStr, bStr string
	fmt.Fscan(reader, &aStr, &bStr)

	ca := make([]int, 26)
	cb := make([]int, 26)

	for i := 0; i < n; i++ {
		ca[aStr[i]-'A']++
	}
	for i := 0; i < m; i++ {
		cb[bStr[i]-'A']++
	}

	fact := make([]int64, n+1)
	invFact := make([]int64, n+1)
	fact[0] = 1
	invFact[0] = 1
	for i := 1; i <= n; i++ {
		fact[i] = (fact[i-1] * int64(i)) % MOD
	}
	invFact[n] = inverse(fact[n])
	for i := n - 1; i >= 1; i-- {
		invFact[i] = (invFact[i+1] * int64(i+1)) % MOD
	}

	dp := make([]int64, ca[0]+1)
	for x := 0; x <= ca[0]; x++ {
		if x <= cb[0] {
			dp[x] = (invFact[x] * invFact[ca[0]-x]) % MOD
		}
	}

	for c := 1; c < 26; c++ {
		prevLen := ca[c-1] + 1
		suf := make([]int64, prevLen+1)
		for i := prevLen - 1; i >= 0; i-- {
			suf[i] = (suf[i+1] + dp[i]) % MOD
		}

		currLen := ca[c] + 1
		newDp := make([]int64, currLen)

		startX, endX := 0, ca[c]
		if c == 25 {
			startX, endX = ca[25], ca[25]
		}

		for x := startX; x <= endX; x++ {
			minPrev := x + ca[c-1] - cb[c]
			if minPrev < 0 {
				minPrev = 0
			}
			var sumPrev int64 = 0
			if minPrev < prevLen {
				sumPrev = suf[minPrev]
			}

			term := (invFact[x] * invFact[ca[c]-x]) % MOD
			newDp[x] = (sumPrev * term) % MOD
		}
		dp = newDp
	}

	ans := (dp[ca[25]] * fact[n]) % MOD
	fmt.Println(ans)
}