后缀数组LightOJ1428

题意:若一个串t是A的子串且t不包含B,称t为A的合法子串。求A不同的合法子串的个数。
思路:这道题的母题:给定一个字符串,求不相同的子串的个数(spoj694,spoj705),先讲一下这个母题:
算法分析:每个子串一定是某个后缀的前缀,那么原问题等价与求所有后缀之间的不相同的前缀的个数。如果所有的后缀按照suffix(sa[1]),suffix(sa[2]),suffix(sa[3])…suffix(sa[n])的顺序计算,不难发现,对于每一次新加进来的后缀suffix(sa[k]),它将产生n-sa[k]+1个新的前缀。但是其中有height[k]个是和前面的字符串的前缀是相同的。所以suffix(sa[k])将“贡献”出n-sa[k]+1-height[k]个不同的子串。累加后便是答案了,时间复杂度是O(N)。
这道题也是求不同子串个数,只是有个要求是子串中不能包含B串。
思路:
首先求出B在A中出现的位置,t [i]表示从A串的i位置向后最早匹配完B的位置为t [i],注意是匹配完B。
这样求出sa和height数组后,枚举i从1到n,设x=t[ sa [i] ] – sa [i],也就是sa[i]这个位置最多产生x个子串,再用n - sa[i]+1和x取小的一个就是sa [i]位置产生的子串,再减去min( x , height [i])就是实际产生的子串。
 

 

posted @ 2013-03-26 21:35  _sunshine  阅读(210)  评论(0编辑  收藏  举报