题意:
给出一个串,q个询问,每个询问要求这个区间[l,r]不同子串的数目。
题解:
这题有两种做法,一种是后缀数组,一种是自动机,两种方法的思想是一致。
用自动机做之前要知道一个性质:每次加入某个字符,会到len[last]-len[fa[last]]个未出现过的子串,并且都是以last为结尾的。那么就好办了,我们并不好在在线获得答案,我们先将询问存下来,然后通过排序按照区间左端点为第一key,右端点为第二key。这样可以大大的降低复杂度。判断i区间的l是否等于i-1区间的l,如果相等从上次的last继续插入字符统计个数,如果不相等就从新建立自动机。这个算法是线性的。
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#include<map>
#include<set>