luogu#P4584. [FJOI2015] 带子串包含约束LCS问题

[FJOI2015] 带子串包含约束LCS问题

题目描述

带有子串包含约束的最长公共子序列问题可以具体表述如下。

给定 22 个长度分别为 nnmm 的序列 XXYY,以及一个子串包含约束集 SS

SS 中共有 kk 个字符串 S={S1,S2,,Sk}S=\{S_1,S_2,…,S_k\},其中字符串 SiS_i 的长度为 lil_i1ik1\le i\le k。带有子串包含约束的最长公共子序列问题就是要找出 XXYY 的包含约束集 SS 中所有字符串为其子串的最长公共子序列。

例如,如果给定的序列 XXYY 分别为 X= actaagacctX =\texttt{ actaagacct}, Y=gacctacctcY = \texttt{gacctacctc},子串包含约束集 S={ata,tact}S=\{\texttt{ata}, \texttt{tact}\},则子序列 actacct\texttt{actacct}XXYY 的一个无约束的最长公共子序列,而包含约束集 SS 中所有字符串为其子串的一个最长公共子序列是 atact\texttt{atact} 。 在本题中请特别关注子串与子序列的区别。字符串 T=t1tnT=t_1…t_n 的子串是一个形如 T=t1+itm+iT'=t_1+i…t_m+i 的字符串,其中,0i0\le im+inm + i\le n。例如,T= abcdefgT =\texttt{ abcdefg},则 bcd\texttt{bcd}TT 的一个子串,而 bce\texttt{bce}TT 的一个子序列,但不是 TT 的子串。

设计一个算法,找出给定序列 XXYY 带有子串包含约束 SS 的最长公共子序列。

输入格式

11 行中给出正整数 n,m,kn,m,knnmm 分别表示给定序列 XXYY 的长度。kk 表示子串包含约束集 SS 中共有 kk 个字符串。

22 行中有 kk 个整数 lil_i,分别表示子串包含约束集 SSkk 个字符串的长度。

33 行和第 44 行分别给出序列 XXYY

接下来 kk 行每行一个字符串 SiS_i

输出格式

输出将计算出的 XXYY 带子串包含约束 SS 的最长公共子序列的长度。

10 10 2
3 4
actaagacct
gacctacctc
ata
tact
5

提示

m<300m<300n<300n<300k<6k<60li3000\le l_i\le 3001ik1\le i\le k

字符串仅包含大小写字母。