char* SbyhSearch(unsigned char *text,int m,int n,int ch[]){ int j; const int yu = 64;//(2*m>32?(2*m>64?128:64):32); int count[yu]; //int yu=2*m; //int count[2*m],yu; for(j=0;j<yu;j++) { count[j]=0; } for(j=0;j<m-1;j++) if((ch[text[j]]!=-1)&&(j-ch[text[j]]>=0) ) count[j-ch[text[j]]]++; for(j=m-1;j<n;j++){ if(ch[text[j]]!=-1){ count[(j-ch[text[j]])%yu]++; } if(count[(j-m +1)%yu]==(m)) { //OUTPUT(j-m); OUTPUT3(text, j-m +1, ch); } count[(j-m+1)%yu]=0; } SRET(j-m); }
/* struct _cell{ int element; struct _cell *next; }; typedef struct _cell *List;*/ char* Sskip2(char *textt,char *patt, int n, int m)//ÌøÔ¾Ëã·¨ { int i, j; unsigned char * text,*pat; text = (unsigned char *) textt; pat = (unsigned char *)patt; List ptr, z[ASIZE]; if(*pat == '\0') { OUTPUT(0);return textt;}; /* Preprocessing */ memset(z, 0, ASIZE*sizeof(List)); for (i = 0; i < m; ++i) { ptr = (List)malloc(sizeof(struct _cell)); if (ptr == NULL) error("SKIP"); ptr->element = i; ptr->next = z[pat[i]]; z[pat[i]] = ptr; } /* Searching */ for (j = m - 1; j < n; j += m) { for (ptr = z[text[j]]; ptr != NULL; ptr = ptr->next) { if (memcmp(pat, text + j - ptr->element, m) == 0) { if (j-ptr->element <= n - m) OUTPUT(j - ptr->element); } else continue; } } SRET(j - ptr->element); }
char* Sbmhs2(char * textt,char *patt,int n, int m)//SUNDAYËã·¨£¬ÓÖ³Æ quich search { int j,qsBc[ASIZE]; unsigned char *text,*pat; text = (unsigned char*)textt; pat = (unsigned char*)patt; if(*pat == '\0') { OUTPUT(0);return textt;}; /* preprocessing */ preQsBc((char*)pat,m,qsBc); /* Searching */ j=0; while (j<=n-m) { if (memcmp(pat,text+j,m)==0) OUTPUT(j); j+=qsBc[text[j+m]]; //shift } SRET(j); }
char* Ssmith2(char * textt,char *patt,int n, int m)//smith ╦сие { int j,bmBc[ASIZE],qsBc[ASIZE]; unsigned char * text,*pat; text = (unsigned char*)textt; pat = (unsigned char*)patt; if(*pat == '\0') { OUTPUT(0);return textt;}; /* preprocessing */ preBmBc((char*)pat,m,bmBc); preQsBc((char*)pat,m,qsBc); /* searching */ j=0; while (j<=n-m) { if (memcmp(pat,text+j,m)==0) OUTPUT(j); j+=MAX(bmBc[text[j+m-1]],qsBc[text[j+m]]); } SRET(j); }
char* Skmpskip2(char *textt,char *patt,int n, int m) { int i, j, k, kmpStart, per, start, wall; unsigned char * text,*pat; text = (unsigned char *) textt; pat = (unsigned char *)patt; int kmpNext[m], list[m], mpNext[m], z[ASIZE]; /* Preprocessing */ preMp((char*)pat, m, mpNext); preKmp((char*)pat, m, kmpNext); memset(z, -1, ASIZE*sizeof(int)); memset(list, -1, m*sizeof(int)); z[pat[0]] = 0; for (i = 1; i < m; ++i) { list[i] = z[pat[i]]; z[pat[i]] = i; } /* Searching */ wall = 0; per = m - kmpNext[m]; i = j = -1; do { j += m; } while (j < n && z[text[j]] < 0); if (j >= n) return NULL; i = z[text[j]]; start = j - i; while (start <= n - m) { if (start > wall) wall = start; k = attempt((char*)text, (char*)pat, m, start, wall); wall = start + k; if (k == m) { OUTPUT(start); i -= per; } else i = list[i]; if (i < 0) { do { j += m; } while (j < n && z[text[j]] < 0); if (j >= n) return NULL; i = z[text[j]]; } kmpStart = start + k - kmpNext[k]; k = kmpNext[k]; start = j - i; while (start < kmpStart || (kmpStart < start && start < wall)) { if (start < kmpStart) { i = list[i]; if (i < 0) { do { j += m; } while (j < n && z[text[j]] < 0); if (j >= n) return NULL; i = z[text[j]]; } start = j - i; } else { kmpStart += (k - mpNext[k]); k = mpNext[k]; } } } SRET(start); }