<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.ta.in.th/index.php?action=history&amp;feed=atom&amp;title=String_Matching</id>
	<title>String Matching - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ta.in.th/index.php?action=history&amp;feed=atom&amp;title=String_Matching"/>
	<link rel="alternate" type="text/html" href="https://wiki.ta.in.th/index.php?title=String_Matching&amp;action=history"/>
	<updated>2026-06-16T22:54:54Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.33.0-alpha</generator>
	<entry>
		<id>https://wiki.ta.in.th/index.php?title=String_Matching&amp;diff=95&amp;oldid=prev</id>
		<title>Tata: Created page with &quot; #include&lt;stdio.h&gt;   #include&lt;algorithm&gt;  #include&lt;string.h&gt;  #include&lt;math.h&gt;  #include&lt;time.h&gt;  using namespace std;  char text[50000005],word[1000005];  int f[1000005];  in...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.ta.in.th/index.php?title=String_Matching&amp;diff=95&amp;oldid=prev"/>
		<updated>2019-03-07T17:14:47Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot; #include&amp;lt;stdio.h&amp;gt;   #include&amp;lt;algorithm&amp;gt;  #include&amp;lt;string.h&amp;gt;  #include&amp;lt;math.h&amp;gt;  #include&amp;lt;time.h&amp;gt;  using namespace std;  char text[50000005],word[1000005];  int f[1000005];  in...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt; #include&amp;lt;stdio.h&amp;gt; &lt;br /&gt;
 #include&amp;lt;algorithm&amp;gt;&lt;br /&gt;
 #include&amp;lt;string.h&amp;gt;&lt;br /&gt;
 #include&amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include&amp;lt;time.h&amp;gt;&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 char text[50000005],word[1000005];&lt;br /&gt;
 int f[1000005];&lt;br /&gt;
 int suff[1000005];&lt;br /&gt;
 int tran[10005][300];&lt;br /&gt;
 int BC[256],GS[1000005],HS[256];&lt;br /&gt;
 int n,m;&lt;br /&gt;
 void BF()&lt;br /&gt;
 {&lt;br /&gt;
 	int a,b,out=0;&lt;br /&gt;
 	printf(&amp;quot;Brute Force\n&amp;quot;);&lt;br /&gt;
 	clock_t t=clock();&lt;br /&gt;
 	for(a=0;a&amp;lt;=n-m;a++)&lt;br /&gt;
 	{&lt;br /&gt;
 		for(b=0;b&amp;lt;m;b++)&lt;br /&gt;
 			if(text[a+b]!=word[b])	break;&lt;br /&gt;
 		if(b==m)&lt;br /&gt;
 			out++;&lt;br /&gt;
 	}printf(&amp;quot;%d words\n&amp;quot;,out);&lt;br /&gt;
 	t=clock()-t;&lt;br /&gt;
 	printf(&amp;quot;Time : %d ms\n&amp;quot;,(int)t);&lt;br /&gt;
 }&lt;br /&gt;
 void RK()&lt;br /&gt;
 {&lt;br /&gt;
 	int a,b,c=0,p,q,out=0;&lt;br /&gt;
 	int sum=0,k=2173913;&lt;br /&gt;
 	printf(&amp;quot;Rabin Karp\n&amp;quot;);&lt;br /&gt;
 	clock_t t=clock();&lt;br /&gt;
 	for(a=0,b=0;a&amp;lt;m;a++)&lt;br /&gt;
 	{&lt;br /&gt;
 		sum*=256;	sum+=word[a];	sum%=k;&lt;br /&gt;
 		b*=256;		b+=text[a];		b%=k;&lt;br /&gt;
 		c*=256;		c%=k;&lt;br /&gt;
 		if(!c)	c=1;&lt;br /&gt;
 	}&lt;br /&gt;
 	for(a=1;a&amp;lt;=n-m;a++)&lt;br /&gt;
 	{&lt;br /&gt;
 		if(b==sum)&lt;br /&gt;
 		{&lt;br /&gt;
 			for(p=a-1,q=0;q&amp;lt;m;q++)&lt;br /&gt;
 				if(text[p+q]!=word[q])	break;&lt;br /&gt;
 			if(q==m)&lt;br /&gt;
 				out++;&lt;br /&gt;
 		}&lt;br /&gt;
 		if(a==n-m)	break;&lt;br /&gt;
 		b-=text[a-1]*c;	b%=k;&lt;br /&gt;
 		if(b&amp;lt;0)	b+=k;&lt;br /&gt;
 		b*=256;	b+=text[a+m-1];	b%=k;&lt;br /&gt;
 	}printf(&amp;quot;%d words\n&amp;quot;,out);&lt;br /&gt;
 	t=clock()-t;&lt;br /&gt;
 	printf(&amp;quot;Time : %d ms\n&amp;quot;,(int)t);&lt;br /&gt;
 }&lt;br /&gt;
 void FA()&lt;br /&gt;
 {&lt;br /&gt;
 	int a,b,c,d,out=0;&lt;br /&gt;
 	printf(&amp;quot;Finite Automaton\n&amp;quot;);&lt;br /&gt;
 	clock_t t=clock();&lt;br /&gt;
 	for(a=0;a&amp;lt;=m;a++)&lt;br /&gt;
 	{&lt;br /&gt;
 		for(b=0;b&amp;lt;256;b++)&lt;br /&gt;
 	    {&lt;br /&gt;
 	    	c=min(m+1,a+2);&lt;br /&gt;
 	        for(;c&amp;gt;0;c--)&lt;br /&gt;
 	        {&lt;br /&gt;
 	        	for(d=0;d&amp;lt;c-1;d++)&lt;br /&gt;
 	            	if(word[d]!=word[a-c+1+d]) break;&lt;br /&gt;
 	         	if(d==c-1 &amp;amp;&amp;amp; word[d]==b)&lt;br /&gt;
 	                break;&lt;br /&gt;
 	        }&lt;br /&gt;
 	     	tran[a][b]=c;&lt;br /&gt;
 	    }&lt;br /&gt;
 	}&lt;br /&gt;
 	for(a=0,b=0;a&amp;lt;n;a++)&lt;br /&gt;
 	{&lt;br /&gt;
 		b=tran[b][text[a]];&lt;br /&gt;
 		if(b==m) out++;&lt;br /&gt;
 	}printf(&amp;quot;%d words\n&amp;quot;,out);&lt;br /&gt;
 	t=clock()-t;&lt;br /&gt;
 	printf(&amp;quot;Time : %d ms\n&amp;quot;,(int)t);&lt;br /&gt;
 }&lt;br /&gt;
 void KMP()&lt;br /&gt;
 {&lt;br /&gt;
 	int a,b,out=0;&lt;br /&gt;
 	printf(&amp;quot;Knute Morris Pratt\n&amp;quot;);&lt;br /&gt;
 	clock_t t=clock();&lt;br /&gt;
 	f[0]=0;&lt;br /&gt;
 	for(a=1,b=0;a&amp;lt;m;a++)&lt;br /&gt;
 		if(word[a]==word[b])&lt;br /&gt;
 		{&lt;br /&gt;
 			f[a]=f[a-1]+1;&lt;br /&gt;
 			b++;&lt;br /&gt;
 		}&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			f[a]=0;&lt;br /&gt;
 			b=0;&lt;br /&gt;
 		}&lt;br /&gt;
 	for(a=0,b=0;a&amp;lt;n;a++)&lt;br /&gt;
 	{&lt;br /&gt;
 		while(b&amp;gt;0 &amp;amp;&amp;amp; word[b]!=text[a])	b=f[b-1];&lt;br /&gt;
 		if(word[b]==text[a])	b++;&lt;br /&gt;
 		if(b==m)&lt;br /&gt;
 		{&lt;br /&gt;
 			out++;&lt;br /&gt;
 			b=f[b-1];&lt;br /&gt;
 		}&lt;br /&gt;
 	}printf(&amp;quot;%d words\n&amp;quot;,out);&lt;br /&gt;
 	t=clock()-t;&lt;br /&gt;
 	printf(&amp;quot;Time : %d ms\n&amp;quot;,(int)t);&lt;br /&gt;
 }&lt;br /&gt;
 void BM()&lt;br /&gt;
 {&lt;br /&gt;
 	int a,b,c,out=0,p,q;&lt;br /&gt;
 	printf(&amp;quot;Boyer Moore\n&amp;quot;);&lt;br /&gt;
 	clock_t t=clock();&lt;br /&gt;
 	//bad char&lt;br /&gt;
 	for(a=0;a&amp;lt;256;a++)	BC[a]=-1;&lt;br /&gt;
 	for(a=m-1;a&amp;gt;=0;a--)&lt;br /&gt;
 		if(BC[word[a]]==-1)&lt;br /&gt;
 			BC[word[a]]=a;&lt;br /&gt;
 	//good suffix&lt;br /&gt;
 	suff[m-1]=m;&lt;br /&gt;
 	for(a=m-2,b=m-1;a&amp;gt;=0;a--)&lt;br /&gt;
 		if(a&amp;gt;b &amp;amp;&amp;amp; suff[a+m-1-c]&amp;lt;a-b)&lt;br /&gt;
 			suff[a]=suff[a+m-1-c];&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			if(a&amp;lt;b)	b=a;&lt;br /&gt;
 			for(c=a;b&amp;gt;=0 &amp;amp;&amp;amp; word[b]==word[b+m-1-c];b--);&lt;br /&gt;
 			suff[a]=c-b;&lt;br /&gt;
 		}&lt;br /&gt;
 	for(a=0;a&amp;lt;m;a++)&lt;br /&gt;
 		GS[a]=m;&lt;br /&gt;
 	for(a=m-1,b=0;a&amp;gt;=0;a--)&lt;br /&gt;
 		if(suff[a]==a+1)&lt;br /&gt;
 			for(;b&amp;lt;m-1-a;b++)&lt;br /&gt;
 				if(GS[b]==m)&lt;br /&gt;
 					GS[b]=m-1-a;&lt;br /&gt;
 	for(a=0;a&amp;lt;m-1;a++)&lt;br /&gt;
 		GS[m-1-suff[a]]=m-1-a;&lt;br /&gt;
 	//calculate&lt;br /&gt;
 	for(a=0;a&amp;lt;=n-m;)&lt;br /&gt;
 	{&lt;br /&gt;
 		for(b=m-1;text[a+b]==word[b];b--);&lt;br /&gt;
 		if(b==-1)&lt;br /&gt;
 		{&lt;br /&gt;
 			out++;&lt;br /&gt;
 			a++;&lt;br /&gt;
 		}&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			p=b-BC[text[a+b]];&lt;br /&gt;
 			q=GS[b];&lt;br /&gt;
 			a+=max(p,q);&lt;br /&gt;
 		}&lt;br /&gt;
 	}printf(&amp;quot;%d words\n&amp;quot;,out);&lt;br /&gt;
 	t=clock()-t;&lt;br /&gt;
 	printf(&amp;quot;Time : %d ms\n&amp;quot;,(int)t);&lt;br /&gt;
 }&lt;br /&gt;
 void BMHS()&lt;br /&gt;
 {&lt;br /&gt;
 	int a,b,c,out=0,p,q,r;&lt;br /&gt;
 	printf(&amp;quot;Boyer Moore + Horspool\n&amp;quot;);&lt;br /&gt;
 	clock_t t=clock();&lt;br /&gt;
 	//bad char&lt;br /&gt;
 	for(a=0;a&amp;lt;256;a++)	BC[a]=-1;&lt;br /&gt;
 	for(a=m-1;a&amp;gt;=0;a--)&lt;br /&gt;
 		if(BC[word[a]]==-1)&lt;br /&gt;
 			BC[word[a]]=a;&lt;br /&gt;
 	//good suffix&lt;br /&gt;
 	suff[m-1]=m;&lt;br /&gt;
 	for(a=m-2,b=m-1;a&amp;gt;=0;a--)&lt;br /&gt;
 		if(a&amp;gt;b &amp;amp;&amp;amp; suff[a+m-1-c]&amp;lt;a-b)&lt;br /&gt;
 			suff[a]=suff[a+m-1-c];&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			if(a&amp;lt;b)	b=a;&lt;br /&gt;
 			for(c=a;b&amp;gt;=0 &amp;amp;&amp;amp; word[b]==word[b+m-1-c];b--);&lt;br /&gt;
 			suff[a]=c-b;&lt;br /&gt;
 		}&lt;br /&gt;
 	for(a=0;a&amp;lt;m;a++)&lt;br /&gt;
 		GS[a]=m;&lt;br /&gt;
 	for(a=m-1,b=0;a&amp;gt;=0;a--)&lt;br /&gt;
 		if(suff[a]==a+1)&lt;br /&gt;
 			for(;b&amp;lt;m-1-a;b++)&lt;br /&gt;
 				if(GS[b]==m)&lt;br /&gt;
 					GS[b]=m-1-a;&lt;br /&gt;
 	for(a=0;a&amp;lt;m-1;a++)&lt;br /&gt;
 		GS[m-1-suff[a]]=m-1-a;&lt;br /&gt;
 	//horspool&lt;br /&gt;
 	for(a=0;a&amp;lt;256;a++)	HS[a]=-1;&lt;br /&gt;
 	for(a=m-2;a&amp;gt;=0;a--)&lt;br /&gt;
 		if(HS[word[a]]==-1)&lt;br /&gt;
 			HS[word[a]]=a;&lt;br /&gt;
 	for(a=0;a&amp;lt;=n-m;)&lt;br /&gt;
 	{&lt;br /&gt;
 		for(b=m-1;text[a+b]==word[b];b--);&lt;br /&gt;
 		if(b==-1)&lt;br /&gt;
 		{&lt;br /&gt;
 			out++;&lt;br /&gt;
 			a++;&lt;br /&gt;
 		}&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			p=b-BC[text[a+b]];	//bad char BM&lt;br /&gt;
 			q=GS[b];	//good suffix BM&lt;br /&gt;
 			r=m-1-HS[text[a+m-1]];	//HS&lt;br /&gt;
 			a+=max(max(p,q),r);&lt;br /&gt;
 		}&lt;br /&gt;
 	}printf(&amp;quot;%d words\n&amp;quot;,out);&lt;br /&gt;
 	t=clock()-t;&lt;br /&gt;
 	printf(&amp;quot;Time : %d ms\n&amp;quot;,(int)t);&lt;br /&gt;
 }&lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
 	&lt;br /&gt;
 	FILE *fp;&lt;br /&gt;
 	fp=fopen(&amp;quot;big_edited.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
 	fgets(text,50000000,fp);&lt;br /&gt;
 	freopen(&amp;quot;test_texts.txt&amp;quot;,&amp;quot;r&amp;quot;,stdin);&lt;br /&gt;
 	for(int a=0;a&amp;lt;10;a++)&lt;br /&gt;
 	{&lt;br /&gt;
 		gets(word);&lt;br /&gt;
 		printf(&amp;quot;==========case %d==========\n&amp;quot;,a+1);&lt;br /&gt;
 		n=strlen(text);	m=strlen(word);&lt;br /&gt;
 		BF();	//Brute Force&lt;br /&gt;
 		RK();	//Rabin Karp&lt;br /&gt;
 		if(a&amp;lt;5)	FA();	//Finite Automaton&lt;br /&gt;
 		KMP();	//Knute Morris Pratt&lt;br /&gt;
 		BM();	//Boyer Moore&lt;br /&gt;
 		BMHS();	//Boyer Moore + Horspool&lt;br /&gt;
 		printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 	}&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Tata</name></author>
		
	</entry>
</feed>