Atcoder Panasonic Programming Contest 2020 E Three Substrings

题意:给你三个串(长度<=2000),串中含有的'?'字符可以匹配成任意字符,这三个串是取自同一个主串的子串,求这个主串的最长长度

这个题好好分析下其实不难,就是个模拟

然后的话,这题很容易想歪,我一开始想,啊,是求三个串的最长公共子串吧,然后又想,唉,只能用SAM,很麻烦,而且完全不会

想歪了!这么求怎么可能对嘛,它取自同一主串,你匹配上最长公共子串,但是这三串前后都不一样怎么行啊,同一主串啊

既然是同一主串那就好办了啊,比如你看这样

主、a、b、c

很明显就是互相射相同片段嘛,比如b射了a的前三个,c射了a的后4个,再判下bc中间那下能不能射就好

那我们就固定a,然后跑b,c的位置就好了嘛,然后记录的话,就记录头的位置吧,方便些

a的头看作0,a,b,c长度分别 6,4,5

那就是b、c的头最多可从 -9 跑到 11,当然多跑点也可,想办法处理就好

提前预处理下匹配情况,记得正数化,最后跑个 O(n^2) 就完事

然后比较巧妙的就是这个匹配情况的预处理

比方说上面那图,b位置-1,那实际上a,b对位字符下标偏移量都为-1嘛,换句话说 i - j  都是 1 嘛,直接判断 ai bj,更新到 ab[i-j]里就好,这么写比较方便,其实也可以不这么写,按我们平常匹配方式也可,也不算麻烦,总之思路对了就能很轻易地做出来了,就是个模拟,嘛。

下面是官方题解:(话说看不懂日文。。

Atcoder Panasonic Programming Contest 2020 E Three Substrings_第1张图片

你可能感兴趣的:(Atcoder Panasonic Programming Contest 2020 E Three Substrings)