Example #1
0
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);
}
Example #2
0
/* 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);
}
Example #3
0
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);
}
Example #4
0
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);
}
Example #5
0
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);
}