## https://yukicoder.me/problems/no/1646 MOD = 998244353 def is_palindrome(word): left = 0 right = len(word) - 1 while left < right: if word[left] != word[right]: return False left += 1 right -= 1 return True def main(): N = int(input()) S = input() if len(S) == 1: if S[0] == "?": print(26) else: print(1) return if S[0] == "?": s1 = -1 else: s1 = ord(S[0]) - ord("a") if S[1] == "?": s2 = -1 else: s2 = ord(S[1]) - ord("a") dp = [[0] * 26 for _ in range(26)] for a in range(26): if s1 == -1 or s1 == a: for b in range(26): if s2 == -1 or s2 == b: if a != b: dp[b][a] = 1 cum_dp = [0 for _ in range(26)] for b in range(26): for a in range(26): cum_dp[b] += dp[b][a] cum_dp[b] %= MOD for s in S[2:]: new_dp = [[0] * 26 for _ in range(26)] if s == "?": target = -1 else: target = ord(s) - ord("a") for b in range(26): for c in range(26): if target == -1 or target == c: if b != c: new_dp[c][b] += (cum_dp[b] - dp[b][c]) % MOD new_dp[c][b] %= MOD dp = new_dp cum_dp = [0 for _ in range(26)] for b in range(26): for a in range(26): cum_dp[b] += dp[b][a] cum_dp[b] %= MOD answer = 0 for b in range(26): answer += cum_dp[b] answer %= MOD print(answer) if __name__ == "__main__": main()