6077 - 基因序列

题目描述

在生物信息学研究中,研究员常需要比较两段基因序列的相似度。现有两段由核苷酸编号组成的序列 AB,长度分别为 NM。序列中的每个元素都是一个 [1, 10^5] 之间的整数。

在比对过程中,研究员会从序列 A 中选出一个子序列 A',再从序列 B 中选出一个子序列 B'

如果子序列 A' 与子序列 B' 完全相同(即长度相同且对应位置的元素相等),则称其为一对“匹配子序列对”。

需要注意的是:

  1. 下标敏感:即使两个子序列所含的元素数值序列相同,只要选取的元素在原序列中的下标集合不同,就视为不同的子序列。
  2. 空序列:根据研究定义,从 AB 中均不选取任何元素所构成的空序列对,也算作一对匹配子序列对。
  3. 子序列:从原序列中选择若干元素(可以不选),在不改变它们相对前后顺序的前提下,提取出来所组成的新序列。

请你编写程序,计算两段序列中共有多少对不同的“匹配子序列对”。由于答案可能很大,请输出对 10^9 + 7 取模后的结果。

输入

第一行包含两个整数 NM,分别表示序列 AB 的长度。

第二行包含 N 个整数,表示序列 A 的各个元素。

第三行包含 M 个整数,表示序列 B 的各个元素。

输出

输出一个整数,表示匹配子序列对的总数对 10^9 + 7 取模后的结果。

样例

输入

2 2
1 3
3 1

输出

3

输入

2 2
1 1
1 1

输出

6

输入

4 4
3 4 5 6
3 4 5 6

输出

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_2B 同理记为 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 51 \le N,M \le 50
6 \sim 251 \le N \le 2000

对于 100\% 的数据,满足 1 \leq N, M \leq 20001 \leq A_i, B_i \leq 10^5

标签
题目参数
时间限制 1 秒
内存限制 512 MB
提交次数 129
通过人数 58
金币数量 0 枚
难度 入门


上一题 下一题