这道题我用后缀自动机来写,就加个简单的标记数组,记录下串的结束位置,也就是该串的第一次出现位置。然后建 f a i l fail fail 树, d f s dfs dfs 遍历。
子树代表的就是以当前结点的串为后缀的子串,那么我们从子树那里继承过来的最大 p o s pos pos 也就是该结点的串的最后一次的出现位置,根据题意,我们找同时出现在前缀和后缀的字符串即可(对应的就是第一次位置是 l e n n o w − 1 len_{now}-1 lennow−1【前缀】,最后一次出现位置为 l e n s − 1 len_s-1 lens−1【后缀】)。
#include