首先在首尾加上两个 1 表示进出,将两段路中间的间隔作为传送门,恰好有 2 \times N 个传送门,根据两段路的经过情况给传送门分类别:
00:用 N 表示,称为无用点,不到达该点。
10:用 S 表示,称为起点,需要通过向右走走到一次。
01:用 T 表示,称为终点,需要通过传送到达一次。
11:用 M 表示,称为中转点,需要分别通过向右和传送到达两次。
容易发现:中转点需要两两配对,起点和终点配对,无用点相互配对。
所以以下三种情况可以直接判无解:
中转点个数不为 2 的倍数
起点个数 \neq 终点个数
无用点个数不为 2 的倍数
接下来考虑具体的配对问题:
对于中转点 M:考虑将连续的四个 M 以 1212 的配对方式消掉,如图所示:
事实上不连续的四个 M 也可以这样消掉,因为 M 的左右对应的路都是 1,左相邻的传送门只能是 T/M,右响铃的传送门只能是 S/M,也就是说两段连续的 M 之间只可能是不断重复的 ST,将 ST 匹配消掉即可,如图所示:
综上所述:当 M 的个数是 4 的倍数时,只需要将所有 M 从左往右按照 1212 的配对方式配对即可。
当 M 的个数不为 4 的倍数时,因为 M 需要两两匹配,有解时一定为 2 的倍数,匹配时考虑将两个 M 消掉,对剩下的 M 按上面的方法匹配。
设两个 M 中位置靠前的为 M_{1},位置靠后的为 M_{2},因为无法使用更多的 M,我们需要通过 M_{1}/M_{2} 所处连续段的前后的 T 和 S 让当前所处位置倒退,以此来二次经过通过传送到达的 M_{2},这样我们就用一对 ST 消掉了两个 M,中间的连续的 M 与其它段的 M 结合,通过之前的方法消掉,然后会二次经过 M_{2},正好将落单的 ST 消掉,两种情况分别如图所示:
如果两种情况均不满足,比如 MSTM 的情况,判成无解。
细节:因为此时的配对起始位置发生了改变,所以将剩下的 M 消掉时不能像之前一直接样从左往右,要先记录中间段的 M,再对剩下未匹配的 M 从左往右记录进行配对。