CF528D Fuzzy Search 做题记录

给出一个门限值 kk 和两个只包含 AGCT\texttt{AGCT} 四种字符的基因串 SSTT。现在你要找出在下列规则中 TTSS 中出现了几次。

TTSS 的第 ii 个位置中出现,当且仅当把 TT 的首字符和 SS 的第 ii 个字符对齐后,TT 中的每一个字符能够在 SS 中找到一个位置偏差不超过 kk 的相同字符。

即对于所有的 j[1,T]j \in[1,|T|],都存在一个 p[1,S]p \in [1,|S|] 使得 (i+j1)pk|(i+j-1)-p| \leq kSp=TjS_p=T_j

例如 k=1k=1 时,ACAT\texttt{ACAT} 出现在 AGCAATTCAT\texttt{AGCAATTCAT}22 号, 33 号和 66 号位置。 (编号从 11 开始。)

考虑设 A,C,G,TA,C,G,T 是四个 0101 序列,表示四种字母是否能在 SS 的某一位上匹配;设 A,C,G,TA_*,C_*,G_*,T_* 是四个 0101 序列表示 TT 的某一位上是否某种字母。

例如样例中:

A={1,1,1,1,1,1,0,1,1,1}A=\{1,1,1,1,1,1,0,1,1,1\}

C={0,1,1,1,0,0,1,1,1,0}C=\{0,1,1,1,0,0,1,1,1,0\}

G={1,1,1,0,0,0,0,0,0,0}G=\{1,1,1,0,0,0,0,0,0,0\}

T={0,0,0,0,1,1,1,1,1,1}T=\{0,0,0,0,1,1,1,1,1,1\}

A={1,0,1,0}A_*=\{1,0,1,0\}

C={0,1,0,0}C_*=\{0,1,0,0\}

G={0,0,0,0}G_*=\{0,0,0,0\}

T={0,0,0,1}T_*=\{0,0,0,1\}

若某个位置 SSTT 对应的序列同时为 11,那么贡献 11,否则贡献 00,也就是做乘法。那么匹配当且仅当四种字符的贡献和是串长。

考虑怎么计算每种字符的贡献,显然把 AACCGGTT 倒过来和 AA_*CC_*GG_*TT_* 做卷积即可。