题目描述
阿轩在纸上写了两个字符串,分别记为A和B。利用在数据结构与算法课上学到的知识,他很容易地求出了“字符串A从任意位置开始的后缀子串”与“字符串B”匹配的长度。
不过阿轩是一个勤学好问的同学,他向你提出了Q个问题:在每个问题中,他给定你一个整数x,请你告诉他有多少个位置,满足“字符串A从该位置开始的后缀子串”与B匹配的长度恰好为x。
例如:A=aabcde,B=ab,则A有aabcde、abcde、bcde、cde、de、e这6个后缀子串,它们与B=ab的匹配长度分别是1、2、0、0、0、0。因此A有4个位置与B的匹配长度恰好为0,有1个位置的匹配长度恰好为1,有1个位置的匹配长度恰好为2。
题解
这道题中我们首先可以想到KMP算法,在KMP算法中对于每一个节点都可以知道匹配了子串的多少位;对于这一个位来说,有可能是刚好长度是这一个,但是更有可能下一位仍然匹配、即长度比这一位还要大;因此我们确定是这一个最大的匹配长度至少有当前这一个匹配的长度。
因此我们就得到了这道题的主要思路:找到长度大小至少为i的匹配个数 c n t [ i ] cnt[i] cnt[i],则对于i的答案一定是 c n t [ i + 1 ] − c n t [ i ] cnt[i+1]-cnt[i] cnt[i+1]−cnt[i],即 c n t [ i ] cnt[i] cnt[i]一定包含 c n t [ i +