QOJ.ac

QOJ

Time Limit: 1 s Memory Limit: 2048 MB Total points: 100

#7955. Tandem Copy

الإحصائيات

串联复制(tandem copy)是 DNA 上的一种操作,指将一段连续的核苷酸序列进行重复,且重复部分直接相邻;换句话说,串联复制操作会将一段连续的核苷酸序列复制,并将其粘贴在原序列之后。例如,$ATCATCG$ 是由 $ATCG$ 中的 $ATC$ 进行串联复制得到的。此外,我们可以在得到的结果序列 $ATCATCG$ 上继续进行另一次串联复制,得到 $ATCATTCG$。以下示例展示了从 $ATCG$ 开始的一系列串联复制,其中下划线标注了每一步被复制的序列。

$$\underline{ATC}G \Rightarrow AT\underline{C}ATCG \Rightarrow AT\underline{CAT}TCG \Rightarrow ATAT\underline{CATT}CG \Rightarrow \cdots$$

我们称 $ATCG$ 通过串联复制产生了所有这些序列。显而易见,$ATCG$ 可以通过在每一步选择序列的不同部分进行串联复制来产生不同的序列。此外,原则上,$ATCG$ 可以通过根据需要进行任意多次串联复制来产生无穷多个序列。

通常,串联复制较长的部分代价更高。例如,$ATCG \Rightarrow ATCATCG$ 是对三个核苷酸进行的串联复制,因此比 $ATCG \Rightarrow ATCCG$(对一个核苷酸进行的串联复制)代价更高。换句话说,每一步复制部分的长度对于确定串联复制的代价至关重要。

由于对单个核苷酸进行串联复制很容易,ICPC 实验室通常以一种方式存储序列,使得序列中任意两个相邻的核苷酸都不相同;这有助于实验室减少存储空间。例如,由于 $ATTTG$ 可以通过将 $ATG$ 中的 $T$ 串联复制两次得到,实验室只需存储较短的序列 $ATG$ 而不是 $ATTTG$。

由于最近的预算削减,ICPC 实验室一次最多只能对两个核苷酸进行串联复制;即每一步复制部分的长度最多为二。另一方面,实验室可以根据需要继续重复进行串联复制。例如,给定序列 $ABC$,我们可以对 $B$ 进行串联复制得到 $ABBCD$,或者对序列 $BC$ 进行串联复制得到 $ABCBCD$。但我们不能对连续序列 $ABC$ 进行串联复制,因为其长度超过了二。

给定源字符串 $s$ 和目标字符串 $t$,你的任务是计算 $s$ 的所有有效子串 $s'$ 的数量,使得通过对 $s'$ 进行适当次数的串联复制操作可以得到一个字符串 $x$,且 $x$ 包含 $t$ 作为其子串。请注意,源字符串中没有两个相邻的核苷酸是相同的,而目标字符串中两个相邻的核苷酸可以相同。例如,$CCA$ 或 $ATTCG$ 不能作为源字符串,但它们可以作为目标字符串。

现在,给定 $s = ACATGCAT$ 和 $t = CCACATTT$,我们取 $s$ 的子串 $s' = CATGC$,并进行如下一系列串联复制: $s' = \underline{CATGC} \Rightarrow C\underline{CA}TGC \Rightarrow CCAC\underline{AT}GC \Rightarrow CCACAT\underline{T}GC \Rightarrow CCACATTTGC$, 它包含了 $t$ 作为其子串。

这是另一个子串示例。对于 $s' = CAT$, $s' = \underline{CAT} \Rightarrow C\underline{AC}AT \Rightarrow CCAC\underline{AT} \Rightarrow CCACAT\underline{T} = t$, 这表明我们可以通过一系列串联复制从 $CAT$ 产生目标字符串。

很容易验证 $s$ 的有效子串总数为 14。注意,$s$ 中的第一个 $CAT$ 和第二个 $CAT$ 都被计为不同的有效子串。因此,你需要考虑 $s$ 的所有子串并分别计数所有有效子串。

这是另一个例子。当 $s = AB$ 且 $t = BA$ 时,你可以取子串 $AB$ 并对 $AB$ 进行串联复制。得到的字符串是 $ABAB$,它包含 $BA$ 作为其子串。$s$ 的所有其他子串都无法产生包含 $BA$ 的字符串,因此有效子串的数量为 1。

给定源字符串 $s$ 和目标字符串 $t$,其中 $s$ 中没有两个相邻字符相同,编写一个程序输出 $s$ 的有效子串 $s'$ 的数量。如果对 $s'$ 进行一系列串联复制可以产生一个包含目标字符串 $t$ 作为子串的字符串,则称 $s'$ 是 $s$ 的有效子串,其中每一步串联复制限制为最多两个连续字符。

输入格式

程序从标准输入读取数据。输入包含两行。第一行是源字符串 $s$,第二行是目标字符串 $t$。每个输入均由大写字母 $A$ 到 $Z$ 组成,且 $1 \le |s|, |t| \le 2 \times 10^4$。

输出格式

程序向标准输出写入数据。仅打印一行。该行应输出有效子串的数量,这些子串通过一系列串联复制可以产生包含目标字符串作为子串的字符串。

样例

样例 1

输入

ACGCG
CCG

输出

9

样例 2

输入

TATCGC
TTCCG

输出

6

样例 3

输入

ABCABC
ABC

输出

7

样例 4

输入

ABCABC
ABCABC

输出

1

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.