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

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

题目描述

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

给定 22 个长度分别为 nn 和 mm 的序列 XX 和 YY,以及一个子串包含约束集 SS。

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

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

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

输入格式

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

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

第 33 行和第 44 行分别给出序列 XX 和 YY 。

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

输出格式

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

10 10 2
3 4
actaagacct
gacctacctc
ata
tact
5

提示

m<300m<300,n<300n<300,k<6k<6,0≤li≤3000\le l_i\le 300,1≤i≤k1\le i\le k。

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