Advertisement

阅读量:

题意解析
提供一个长度为n的长字符串,“完美子串”指的是同时作为该字符串前缀和后缀的子串,目标是计算所有“完美子串”的数量,并统计这些子串在原字符串中出现的次数

1、 利用常规KMP算法中的next数组,可以确定完美子串的数量。首先,原字符串自身即为一个完美子串。
设定字符串长度为n,随后借助next数组进行反复回溯,

复制代码
    int perfect = 0;	//完美子串的数量
    int k = n;
    while(k)
    {
    	len[++len_cnt] = k;		// 完美子串的长度
    	++perfect;
    	k = Next[k];
    }
    
    
      
      
      
      
      
      
      
      
    

2、 通过拓展KMP算法,可获取与自身前缀相匹配的子串。
z[] 数组的含义为:z[i] 表示字符串s与其从i位置开始至末尾的子串之间的最长公共前缀长度。

3、 结构体数组LCP[i]用于存储长度为i的子串对应的长度值len,以及在所有子串中长度不小于len的数量信息

复制代码
    struct node
    {
    	int len;	// z[i] = len 时候
    	int cnt;

全部评论 (0)

还没有任何评论哟~