import
java.io.*;
import
java.io.IOException;
public
class
GFG {
public
static
void
main(String[] args)
throws
IOException
{
System.out.println(
"Bitap Algorithm!"
);
String text =
"geeksforgeeks"
;
String pattern =
"geeks"
;
GFG g =
new
GFG();
g.findPattern(text, pattern);
}
public
void
findPattern(String t, String p)
{
char
[] text = t.toCharArray();
char
[] pattern = p.toCharArray();
int
index = bitap_search(text, pattern);
if
(index == -
1
) {
System.out.println(
"\nNo Match\n"
);
}
else
{
System.out.println(
"\nPattern found at index: \n"
+ index);
}
}
private
int
bitap_search(
char
[] text,
char
[] pattern)
{
int
len = pattern.length;
long
pattern_mask[]
=
new
long
[Character.MAX_VALUE +
1
];
long
R = ~
1
;
if
(len ==
0
) {
return
-
1
;
}
if
(len >
63
) {
System.out.println(
"Pattern too long!"
);
return
-
1
;
}
for
(
int
i =
0
; i <= Character.MAX_VALUE; ++i)
pattern_mask[i] = ~
0
;
for
(
int
i =
0
; i < len; ++i)
pattern_mask[pattern[i]] &= ~(1L << i);
for
(
int
i =
0
; i < text.length; ++i) {
R |= pattern_mask];
R <<=
1
;
if
((R & (1L << len)) ==
0
)
return
i - len +
1
;
}
return
-
1
;
}
}