static void pre_bm_gs(const char* pattern, int pattern_length, int* table_gs) { int last_prefix_pos = pattern_length; for(int i=pattern_length-1; i>=0; i--) { if(is_prefix(pattern,pattern_length,i+1)) last_prefix_pos=i+1; table_gs[pattern_length-i-1]=last_prefix_pos + pattern_length - i - 1; } for(int i=0; i<pattern_length-1; i++) { int suff_len = suffix_length(pattern,pattern_length,i); table_gs[suff_len] = pattern_length + suff_len - i - 1; } }
void make_delta2(int *delta2, char *pat, int patlen) { int p; int last_prefix_index = patlen-1; // first loop for (p=patlen-1; p>=0; p--) { if (is_prefix(pat, patlen, p+1)) { last_prefix_index = p+1; } delta2[p] = last_prefix_index + (patlen-1 - p); } // second loop for (p=0; p < patlen-1; p++) { int slen = suffix_length(pat, patlen, p); if (pat[p - slen] != pat[patlen-1 - slen]) { delta2[patlen-1 - slen] = patlen-1 - p + slen; } } }
void make_delta2(int *delta2, uint8_t *pat, int32_t patlen) { int p; int last_prefix_index = patlen-1; /*first loop:Gs规则case 2*/ for (p=patlen-1; p>=0; p--) { if (is_prefix(pat, patlen, p+1)) { //从p+1开始的后缀是否存在前缀(p失配) last_prefix_index = p+1; //last_prefix_index记录从右至左最后一个匹配字符的index(即p的右边) } //若存在前缀,保存最后一个匹配字符的index;否则,保存上次已匹配字符的index delta2[p] = last_prefix_index; //@bug 1: + (patlen-1 - p); } /*second loop:Gs规则case 1,因为case 2是前缀,而中间的子串(可以看做[0,p]的suffix)也可能=P的suffix, 且有可能不止一个中间子串,故p从左向后进行处理,保存最靠近P的suffix的对应子串前一个字符的shift长度 */ for (p=0; p < patlen-1; p++) { int slen = suffix_length(pat, patlen, p); //末尾向左对应的从p向左的最长后缀的长度 /*若已匹配suffix-suffix对的前导字符不匹配,保存向左的第一个失配字符的shift长度(即suffix-suffix对的起始位置之差) 若匹配,则为前缀即case 2,无需改变shift值 */ if (slen > 0 && pat[p - slen] != pat[patlen-1 - slen]) { //slen=0, 即case 3:delta2[patlen-1-slen]=delta2[patlen-1]=patlen delta2[patlen-1 - slen] = patlen-1 - p ; //@bug 2: + slen; } } }