A71993. 基因序列
编程题
入门
知识点
题目描述
在生物信息学研究中,研究员常需要比较两段基因序列的相似度。现有两段由核苷酸编号组成的序列 A 和 B,长度分别为 N 和 M。序列中的每个元素都是一个 [1, 10^5] 之间的整数。
在比对过程中,研究员会从序列 A 中选出一个子序列 A',再从序列 B 中选出一个子序列 B'。
如果子序列 A' 与子序列 B' 完全相同(即长度相同且对应位置的元素相等),则称其为一对“匹配子序列对”。
需要注意的是:
- 下标敏感:即使两个子序列所含的元素数值序列相同,只要选取的元素在原序列中的下标集合不同,就视为不同的子序列。
- 空序列:根据研究定义,从 A 和 B 中均不选取任何元素所构成的空序列对,也算作一对匹配子序列对。
- 子序列:从原序列中选择若干元素(可以不选),在不改变它们相对前后顺序的前提下,提取出来所组成的新序列。
请你编写程序,计算两段序列中共有多少对不同的“匹配子序列对”。由于答案可能很大,请输出对 10^9 + 7 取模后的结果。
输入格式
第一行包含两个整数 N 和 M,分别表示序列 A 和 B 的长度。
第二行包含 N 个整数,表示序列 A 的各个元素。
第三行包含 M 个整数,表示序列 B 的各个元素。
输出格式
输出一个整数,表示匹配子序列对的总数对 10^9 + 7 取模后的结果。
输入输出样例
输入 #1
2 2 1 3 3 1
输出 #1
3
输入 #2
2 2 1 1 1 1
输出 #2
6
输入 #3
4 4 3 4 5 6 3 4 5 6
输出 #3
16
说明/提示
输入样例 4
10 9
9 6 5 7 5 9 8 5 6 7
8 6 8 5 5 7 9 9 7
输出样例 4
191
样例 1 说明:
- A 的子序列有:\emptyset, (1), (3), (1,3);
- B 的子序列有:\emptyset, (3), (1), (3,1)。
匹配的子序列对为:(\emptyset, \emptyset)、((1), (1))、((3), (3)),共 3 对。
样例 2 说明:
A 有两个位置可以选出 (1),记为 A_1, A_2;B 同理记为 B_1, B_2。 匹配对如下:
- 空序列匹配:(\emptyset, \emptyset),共 1 对;
- 长度为 1 的匹配:(A_1, B_1), (A_1, B_2), (A_2, B_1), (A_2, B_2),共 4 对;
- 长度为 2 的匹配:((A_1, A_2), (B_1, B_2)),共 1 对。 总计 1 + 4 + 1 = 6 对。
数据范围
| 测试点编号 | N,M |
|---|---|
| 1 \sim 5 | 1 \le N,M \le 50 |
| 6 \sim 25 | 1 \le N \le 2000 |
对于 100\% 的数据,满足 1 \leq N, M \leq 2000,1 \leq A_i, B_i \leq 10^5。