本题的关键算法是字符串的游程编码,也就是把连续相同字符压缩成一个字符和出现次数。
一次操作只能删除两个相邻相同字符中的一个,因此它只会让某一段连续相同字符的长度减少 1,不会改变各段字符的顺序,也不能把某一段完全删掉。
所以字符串 B 能变成字符串 A,等价于:
B 和 A 的游程字符序列完全相同,并且 B 中每一段的长度都大于等于 A 中对应段的长度。
有一个字符串 A,并将其称为“好看串”。
对于任意字符串 B,可以反复执行以下操作:选择 B 中两个相邻且相同的字符,删除其中一个。如果 B 能够通过若干次(包括 0 次)这样的操作变成 A,则称 B 也是“好看串”。
现在给定一个字符串 S。S 的一个子串定义为 S 中连续的一段字符。请你计算 S 中有多少个子串是“好看串”。
如果两个子串在 S 中的出现位置不同,即使它们的内容完全相同,也视为不同的子串。
约束条件:
输入共三行。
第一行包含两个整数 n 和 m,依次表示字符串 A 与字符串 S 的长度。
第二行包含一个长度为 n 的字符串 A。
第三行包含一个长度为 m 的字符串 S。
输出一个整数,表示 S 中子串中“好看串”的数量。
输入
3 5
aaa
aaaaa
输出
6
说明
好看串共有以下 6 个:
S[1..3] = aaaS[2..4] = aaaS[3..5] = aaaS[1..4] = aaaaS[2..5] = aaaaS[1..5] = aaaaa输入
3 7
aba
aaabbaa
输出
6
说明
好看串共有以下 6 个:
S[1..6] = aaabbaS[1..7] = aaabbaaS[2..6] = aabbaS[2..7] = aabbaaS[3..6] = abbaS[3..7] = abbaa输入
1 1
a
b
输出
0
说明
A 是单个字符 a,而 S 的唯一子串是 b。
由于 b 无法通过删除相邻相同字符变成 a,也没有其他子串可选,因此好看子串数量为 0。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册