// C++ program to search all anagrams of a pattern in a text
#include<iostream>
#include<cstring>
#define MAX 256
using namespace std;
// This function returns true if contents of arr1[] and arr2[]
// are same, otherwise false.
bool compare(int arr1[], int arr2[])
{
for (int i=0; i<MAX; i++)
if (arr1[i] != arr2[i])
return false;
return true;
}
// This function search for all permutations of pat[] in txt[]
void search(char *pat, char *txt)
{
int M = strlen(pat), N = strlen(txt);
// countP[]: Store count of all characters of pattern
// countTW[]: Store count of current window of text
int countP[MAX] = {0}, countTW[MAX] = {0};
for (int i = 0; i < M; i++)
{
(countP[pat[i]])++;
(countTW[txt[i]])++;
}
// Traverse through remaining characters of pattern
for (int i = M; i < N; i++)
{
// Compare counts of current window of text with
// counts of pattern[]
if (compare(countP, countTW))
cout << "Found at Index " << (i - M) << endl;
// Add current character to current window
(countTW[txt[i]])++;
// Remove the first character of previous window
countTW[txt[i-M]]--;
}
// Check for the last window in text
if (compare(countP, countTW))
cout << "Found at Index " << (N - M) << endl;
}
/* Driver program to test above function */
int main()
{
char txt[] = "AAABABAA";
char pat[] = "AABA";
search(pat, txt);
return 0;
}
Ly8gQysrIHByb2dyYW0gdG8gc2VhcmNoIGFsbCBhbmFncmFtcyBvZiBhIHBhdHRlcm4gaW4gYSB0ZXh0IAojaW5jbHVkZTxpb3N0cmVhbT4gCiNpbmNsdWRlPGNzdHJpbmc+IAojZGVmaW5lIE1BWCAyNTYgCnVzaW5nIG5hbWVzcGFjZSBzdGQ7IAoKLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgY29udGVudHMgb2YgYXJyMVtdIGFuZCBhcnIyW10gCi8vIGFyZSBzYW1lLCBvdGhlcndpc2UgZmFsc2UuIApib29sIGNvbXBhcmUoaW50IGFycjFbXSwgaW50IGFycjJbXSkgCnsgCglmb3IgKGludCBpPTA7IGk8TUFYOyBpKyspIAoJCWlmIChhcnIxW2ldICE9IGFycjJbaV0pIAoJCQlyZXR1cm4gZmFsc2U7IAoJcmV0dXJuIHRydWU7IAp9IAoKLy8gVGhpcyBmdW5jdGlvbiBzZWFyY2ggZm9yIGFsbCBwZXJtdXRhdGlvbnMgb2YgcGF0W10gaW4gdHh0W10gCnZvaWQgc2VhcmNoKGNoYXIgKnBhdCwgY2hhciAqdHh0KSAKeyAKCWludCBNID0gc3RybGVuKHBhdCksIE4gPSBzdHJsZW4odHh0KTsgCgoJLy8gY291bnRQW106IFN0b3JlIGNvdW50IG9mIGFsbCBjaGFyYWN0ZXJzIG9mIHBhdHRlcm4gCgkvLyBjb3VudFRXW106IFN0b3JlIGNvdW50IG9mIGN1cnJlbnQgd2luZG93IG9mIHRleHQgCglpbnQgY291bnRQW01BWF0gPSB7MH0sIGNvdW50VFdbTUFYXSA9IHswfTsgCglmb3IgKGludCBpID0gMDsgaSA8IE07IGkrKykgCgl7IAoJCShjb3VudFBbcGF0W2ldXSkrKzsgCgkJKGNvdW50VFdbdHh0W2ldXSkrKzsgCgl9IAoKCS8vIFRyYXZlcnNlIHRocm91Z2ggcmVtYWluaW5nIGNoYXJhY3RlcnMgb2YgcGF0dGVybiAKCWZvciAoaW50IGkgPSBNOyBpIDwgTjsgaSsrKSAKCXsgCgkJLy8gQ29tcGFyZSBjb3VudHMgb2YgY3VycmVudCB3aW5kb3cgb2YgdGV4dCB3aXRoIAoJCS8vIGNvdW50cyBvZiBwYXR0ZXJuW10gCgkJaWYgKGNvbXBhcmUoY291bnRQLCBjb3VudFRXKSkgCgkJCWNvdXQgPDwgIkZvdW5kIGF0IEluZGV4ICIgPDwgKGkgLSBNKSA8PCBlbmRsOyAKCgkJLy8gQWRkIGN1cnJlbnQgY2hhcmFjdGVyIHRvIGN1cnJlbnQgd2luZG93IAoJCShjb3VudFRXW3R4dFtpXV0pKys7IAoKCQkvLyBSZW1vdmUgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBwcmV2aW91cyB3aW5kb3cgCgkJY291bnRUV1t0eHRbaS1NXV0tLTsgCgl9IAoKCS8vIENoZWNrIGZvciB0aGUgbGFzdCB3aW5kb3cgaW4gdGV4dCAKCWlmIChjb21wYXJlKGNvdW50UCwgY291bnRUVykpIAoJCWNvdXQgPDwgIkZvdW5kIGF0IEluZGV4ICIgPDwgKE4gLSBNKSA8PCBlbmRsOyAKfSAKCi8qIERyaXZlciBwcm9ncmFtIHRvIHRlc3QgYWJvdmUgZnVuY3Rpb24gKi8KaW50IG1haW4oKSAKeyAKCWNoYXIgdHh0W10gPSAiQUFBQkFCQUEiOyAKCWNoYXIgcGF0W10gPSAiQUFCQSI7IAoJc2VhcmNoKHBhdCwgdHh0KTsgCglyZXR1cm4gMDsgCn0gCg==