CF2255B A Ribbon for Tomorrow
题目描述
Nephren 从不喜欢冗长的告别。在 Chtholly 即将前往下一个任务之前,她什么也没说,只是开始为她准备一条小丝带。
她把 $n$ 颗玻璃珠子排成一排放在桌上,然后将它们穿到丝带上。每颗珠子要么是白色,要么是黑色。一个二进制字符串 $s$ 描述了它们的颜色:字符 $\mathtt{0}$ 表示白色珠子,字符 $\mathtt{1}$ 表示黑色珠子。
为了让排列变得不那么普通,Nephren 设计了一个小游戏。她可以进行如下操作任意次(包括零次):
- 选择两个下标 $l$ 和 $r$($1 \le l \le r \le n$),使得当前字符串中 $s_l = s_r$,然后将子串 $s_l s_{l+1}\ldots s_r$ 反转。
例如,如果 $s = \mathtt{00110}$,Nephren 可以选择 $l = 1$ 和 $r = 5$,因为 $s_1 = s_5 = \mathtt{0}$。执行操作后,字符串变成 $\mathtt{01100}$。
请你求出 Nephren 能通过上述操作获得多少种不同的二进制字符串。由于答案可能很大,请将其对 $998\,244\,353$ 取模后输出。
一个二进制字符串是指每个字符都是 $\mathtt{0}$ 或 $\mathtt{1}$ 的字符串。
反转子串 $s_l s_{l+1}\ldots s_r$ 指的是用 $s_r s_{r-1}\ldots s_l$ 替换它。
输入格式
每个测试包含多组测试用例。第一行包含一个整数 $t$($1 \le t \le 10^4$),表示测试用例的个数。
每个测试用例第一行包含一个整数 $n$($1 \le n \le 10^6$),表示珠子的数量。
第二行包含一个长度为 $n$ 的二进制字符串 $s$,描述这些珠子的颜色。
保证所有测试用例中 $n$ 的总和不超过 $10^6$。
输出格式
对于每个测试用例,输出一个整数,表示从 $s$ 经过任意次数操作后能获得的不同二进制字符串的数量,对 $998\,244\,353$ 取模。
说明/提示
在第一个测试用例中,恰好能获得如下两个字符串:
- $\mathtt{00110}$
- $\mathtt{01100}$
例如,对整个字符串 $\mathtt{00110}$ 反转可得到 $\mathtt{01100}$。
在第二个测试用例中,恰好能获得如下三个字符串:
- $\mathtt{001010}$
- $\mathtt{010010}$
- $\mathtt{010100}$
例如,通过将 $\mathtt{001010}$ 的前四个字符反转,可以得到 $\mathtt{010010}$,反转整个字符串可以得到 $\mathtt{010100}$。
在第三个测试用例中,每个端点相同的子串本身都是回文串,因此任何合法操作都无法改变字符串,只能得到 $\mathtt{01010}$。
在第四个测试用例中,只能得到 $\mathtt{111111}$。
由 ChatGPT 5 翻译