对所有的模板串建一个广义 \(\tt{SAM}\),在每个点上开个主席树,下标为是第几个串,权值为 endpos 的数量。
然后线段树合并。
预处理每个文本串前缀 \(r\) 在 \(\tt{SAM}\) 的最长匹配后缀长度与对应的点。
查询的时候从 \(r\) 的这个后缀在 \(\tt{SAM}\) 上的点向上跳跳跳(为了保证复杂度使用倍增),目的是让匹配到整个子串,也就是说最长匹配后缀的长度大于等于子串的长度。
找到这个点后直接来一波线段树上查询就做完了。
难度主要在代码难度但我没写出来,好耶!