#include <stdlib.h>
#include <string.h>
typedef char BIT; /* needs only to hold the values 0 and 1 */
const char *bitap_search(const char *text, const char *pattern)
{
const char *result = NULL;
int m = strlen(pattern);
BIT *R;
int i, k;
if (pattern[0] == '\0') return text;
/* Initialize the bit array R */
R = malloc((m+1) * sizeof *R);
R[0] = 1;
for (k=1; k <= m; ++k)
R[k] = 0;
for (i=0; text[i] != '\0'; ++i) {
/* Update the bit array. */
for (k=m; k >= 1; --k)
R[k] = R[k-1] && (text[i] == pattern[k-1]);
if (R[m]) {
result = (text+i - m) + 1;
break;
}
}
free(R);
return result;
}
ICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogdHlwZWRlZiBjaGFyIEJJVDsgLyogbmVlZHMgb25seSB0byBob2xkIHRoZSB2YWx1ZXMgMCBhbmQgMSAqLwogCiBjb25zdCBjaGFyICpiaXRhcF9zZWFyY2goY29uc3QgY2hhciAqdGV4dCwgY29uc3QgY2hhciAqcGF0dGVybikKIHsKICAgICBjb25zdCBjaGFyICpyZXN1bHQgPSBOVUxMOwogICAgIGludCBtID0gc3RybGVuKHBhdHRlcm4pOwogICAgIEJJVCAqUjsKICAgICBpbnQgaSwgazsKIAogICAgIGlmIChwYXR0ZXJuWzBdID09ICdcMCcpIHJldHVybiB0ZXh0OwogCiAgICAgLyogSW5pdGlhbGl6ZSB0aGUgYml0IGFycmF5IFIgKi8KICAgICBSID0gbWFsbG9jKChtKzEpICogc2l6ZW9mICpSKTsKICAgICBSWzBdID0gMTsKICAgICBmb3IgKGs9MTsgayA8PSBtOyArK2spCiAgICAgICBSW2tdID0gMDsKIAogICAgIGZvciAoaT0wOyB0ZXh0W2ldICE9ICdcMCc7ICsraSkgewogICAgICAgICAvKiBVcGRhdGUgdGhlIGJpdCBhcnJheS4gKi8KICAgICAgICAgZm9yIChrPW07IGsgPj0gMTsgLS1rKQogICAgICAgICAgIFJba10gPSBSW2stMV0gJiYgKHRleHRbaV0gPT0gcGF0dGVybltrLTFdKTsKIAogICAgICAgICBpZiAoUlttXSkgewogICAgICAgICAgICAgcmVzdWx0ID0gKHRleHQraSAtIG0pICsgMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCiAgICAgZnJlZShSKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQo=