hash( txt[s+1 .. s+m] ) = ( d ( hash( txt[s .. s+m-1]) – txt[s]*h ) + txt[s + m] ) mod q
hash( txt[s .. s+m-1] ) : Hash value at shift s.
hash( txt[s+1 .. s+m] ) : Hash value at next shift (or shift s+1)
d: Number of characters in the alphabet
q: A prime number
h: d^(m-1)
// Following program is a Java implementation // of Rabin Karp Algorithm given in the CLRS book publicclassMain { // d is the number of characters in the input alphabet publicfinalstaticintd=256; /* pat -> pattern txt -> text q -> A prime number */ staticvoidsearch(String pat, String txt, int q) { intM= pat.length(); intN= txt.length(); int i, j; intp=0; // hash value for pattern intt=0; // hash value for txt inth=1; // The value of h would be "pow(d, M-1)%q" for (i = 0; i < M-1; i++) h = (h*d)%q; // Calculate the hash value of pattern and first // window of text for (i = 0; i < M; i++) { p = (d*p + pat.charAt(i))%q; t = (d*t + txt.charAt(i))%q; } // Slide the pattern over text one by one for (i = 0; i <= N - M; i++) { // Check the hash values of current window of text // and pattern. If the hash values match then only // check for characters on by one if ( p == t ) { /* Check for characters one by one */ for (j = 0; j < M; j++) { if (txt.charAt(i+j) != pat.charAt(j)) break; } // if p == t and pat[0...M-1] = txt[i, i+1, ...i+M-1] if (j == M) System.out.println("Pattern found at index " + i); } // Calculate hash value for next window of text: Remove // leading digit, add trailing digit if ( i < N-M ) { t = (d*(t - txt.charAt(i)*h) + txt.charAt(i+M))%q; // We might get negative value of t, converting it // to positive if (t < 0) t = (t + q); } } } /* Driver program to test above function */ publicstaticvoidmain(String[] args) { Stringtxt="GEEKS FOR GEEKS"; Stringpat="GEEK"; intq=101; // A prime number search(pat, txt, q); } } // This code is contributed by nuclode