// C++ program to count total anagram
// substring of a string
#include <bits/stdc++.h>
using namespace std;
// Total number of lowercase characters
#define MAX_CHAR 26
// Utility method to return integer index
// of character 'c'
int toNum(char c)
{
return (c - 'a');
}
// Returns count of total number of anagram
// substrings of string str
int countOfAnagramSubstring(string str)
{
int N = str.length();
// To store counts of substrings with given
// set of frequencies.
map<vector<int>, int> mp;
// loop for starting index of substring
for (int i=0; i<N; i++)
{
vector<int> freq(MAX_CHAR, 0);
// loop for length of substring
for (int j=i; j<N; j++)
{
// update freq array of current
// substring
freq[toNum(str[j])]++;
// increase count corresponding
// to this freq array
mp[freq]++;
}
}
// loop over all different freq array and
// aggregate substring count
int result = 0;
for (auto it=mp.begin(); it!=mp.end(); it++)
{
int freq = it->second;
result += ((freq) * (freq-1))/2;
}
return result;
}
// Driver code to test above methods
int main()
{
string str = "abba";
cout << countOfAnagramSubstring(str) << endl;
return 0;
}
Ly8gQysrIHByb2dyYW0gdG8gY291bnQgdG90YWwgYW5hZ3JhbSAKLy8gc3Vic3RyaW5nIG9mIGEgc3RyaW5nIAojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4gCnVzaW5nIG5hbWVzcGFjZSBzdGQ7IAoKLy8gVG90YWwgbnVtYmVyIG9mIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIAojZGVmaW5lIE1BWF9DSEFSIDI2IAoKLy8gVXRpbGl0eSBtZXRob2QgdG8gcmV0dXJuIGludGVnZXIgaW5kZXggCi8vIG9mIGNoYXJhY3RlciAnYycgCmludCB0b051bShjaGFyIGMpIAp7IAoJcmV0dXJuIChjIC0gJ2EnKTsgCn0gCgovLyBSZXR1cm5zIGNvdW50IG9mIHRvdGFsIG51bWJlciBvZiBhbmFncmFtIAovLyBzdWJzdHJpbmdzIG9mIHN0cmluZyBzdHIgCmludCBjb3VudE9mQW5hZ3JhbVN1YnN0cmluZyhzdHJpbmcgc3RyKSAKeyAKCWludCBOID0gc3RyLmxlbmd0aCgpOyAKCgkvLyBUbyBzdG9yZSBjb3VudHMgb2Ygc3Vic3RyaW5ncyB3aXRoIGdpdmVuIAoJLy8gc2V0IG9mIGZyZXF1ZW5jaWVzLiAKCW1hcDx2ZWN0b3I8aW50PiwgaW50PiBtcDsgCgoJLy8gbG9vcCBmb3Igc3RhcnRpbmcgaW5kZXggb2Ygc3Vic3RyaW5nIAoJZm9yIChpbnQgaT0wOyBpPE47IGkrKykgCgl7IAoJCXZlY3RvcjxpbnQ+IGZyZXEoTUFYX0NIQVIsIDApOyAKCgkJLy8gbG9vcCBmb3IgbGVuZ3RoIG9mIHN1YnN0cmluZyAKCQlmb3IgKGludCBqPWk7IGo8TjsgaisrKSAKCQl7IAoJCQkvLyB1cGRhdGUgZnJlcSBhcnJheSBvZiBjdXJyZW50IAoJCQkvLyBzdWJzdHJpbmcgCgkJCWZyZXFbdG9OdW0oc3RyW2pdKV0rKzsgCgoJCQkvLyBpbmNyZWFzZSBjb3VudCBjb3JyZXNwb25kaW5nIAoJCQkvLyB0byB0aGlzIGZyZXEgYXJyYXkgCgkJCW1wW2ZyZXFdKys7IAoJCX0gCgl9IAoKCS8vIGxvb3Agb3ZlciBhbGwgZGlmZmVyZW50IGZyZXEgYXJyYXkgYW5kIAoJLy8gYWdncmVnYXRlIHN1YnN0cmluZyBjb3VudCAKCWludCByZXN1bHQgPSAwOyAKCWZvciAoYXV0byBpdD1tcC5iZWdpbigpOyBpdCE9bXAuZW5kKCk7IGl0KyspIAoJeyAKCQlpbnQgZnJlcSA9IGl0LT5zZWNvbmQ7IAoJCXJlc3VsdCArPSAoKGZyZXEpICogKGZyZXEtMSkpLzI7IAoJfSAKCXJldHVybiByZXN1bHQ7IAp9IAoKLy8gRHJpdmVyIGNvZGUgdG8gdGVzdCBhYm92ZSBtZXRob2RzIAppbnQgbWFpbigpIAp7IAoJc3RyaW5nIHN0ciA9ICJhYmJhIjsgCgljb3V0IDw8IGNvdW50T2ZBbmFncmFtU3Vic3RyaW5nKHN0cikgPDwgZW5kbDsgCglyZXR1cm4gMDsgCn0gCg==