每个询问串倍长接在后边,然后在主串的\(\text{SAM}\)里跑匹配。如果没有本质不同的要求,按照 6 的做法即可。有了这个要求,就在找到的最浅的满足要求的点打个标记,如果该点打过标记就不计入答案。
下面是广义\(\text{SAM}\)。
11、给定n个字符串,求每个字符串有多少个子串是至少k个串的子串
在\(\text{SAM}\)上每个状态开\(\text{set}\)记录这个状态是哪些串的子串。
然后对于每个字符串在广义\(\text{SAM}\)上跑匹配,如果匹配到的点的出现次数\(<k\),那就暴力跳\(\text{father}\)直到出现次数 \(\ge k\)。那当前节点的 \(len\) 值就需要被加进答案里。本质上统计的是对于每个 \(x\),每个串的所有以 \(x\) 为结束点的子串的个数。
12、给定n个字符串,对于每个字符串求有多少子串满足该子串没有在其它任何一个字符串中出现
建广义\(\text{SAM}\),每个节点打标记是在哪个串出现。如果有多个标记设置为 \(-1\)。然后一路拓扑即可。因为在\(\text{parent}\)树上一个点的标记是 \(-1\),那么它所有祖先的标记一定都是 \(-1\)。