#CSP1132. 密码 (password)

密码 (password)

题目描述

你要登录某个神秘的系统,但你忘记了自己设置的密码。系统不支持重置密码,所以唯一的登录方式就是不断尝试。幸运的是,你还记得一些有关密码的信息:

首先,你确定密码的长度是 nn

然后你记住的信息可以用一个长度为 nn 的字符串 SS 来描述。假设 SS 的第 ii 个字符为 sis_i,那么:

  • 如果 sis_i 是大写字母或数字字符, 则密码的第 ii 个字符必须是 sis_i;
  • 如果 sis_i 是小写字母, 那么密码的第 ii 个字符可能是 sis_isis_i 的大写形式;
  • 如果 sis_i 是问号 '?' , 那么密码的第 ii 个字符可以是任意大写字母、小写字母和数字字符。

保证字符串 SS 仅包含大写字母、小写字母、数字字符和问号 '?' 。

此外, 系统对密码还有几点要求:

  • 密码中至少出现一个大写字母;
  • 密码中至少出现一个小写字母;
  • 密码中至少出现一个数字字符;
  • 密码中任意两个相邻的字符不能相同。

现在你想知道有多少种可能的密码。一个可能的密码应当既符合你的记忆, 又符合系统的要求, 并且数据保证至少存在一个可能的密码。

答案对 998244353998244353 取模。请注意不常见的内存限制。

输入格式

password.in 文件读入数据。

第一行一个整数 nn

第二行一个字符串 SS,保证字符串 SS 仅包含大写字母、小写字母、数字字符和问号 '?' 。

输出格式

输出到 password.out 文件。

输出一行一个整数,代表答案模 998244353998244353 。保证至少存在一种可能的密码。

样例

4
a?0B
86

样例 2

点击链接 ex_password2.inex_password2.out 下载大样例 2 的输入数据和输出数据。

数据范围

对于所有数据,1n1051 \leq n\leq 10^5,保证字符串 SS 仅包含大写字母、小写字母、数字字符和问号 '?' 。

子任务 分数 附加约束条件
11 1010 n4n\le 4
22 2020 SS 中小写字符的个数 10\le 10,'?' 的个数 3\le 3
33   2020   SS 中没有 '?'
44 2020 N1000N\le 1000
55 3030 无附加限制