1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#include<iostream>
#include<vector>
#include<string>
#include<unordered_map>
#include<set>
#include<algorithm>
std::size_t similar_words(std::vector<std::string> &vec)
{
std::size_t count{};
std::unordered_map<std::string,std::size_t> m{};
for(auto& str : vec)
{
std::set<char> chars{};
str.erase(std::remove_if(str.begin(),str.end(),
[&chars](char c){
if(chars.count(c)) return true;
chars.insert(c);
return false;
}),
str.end());
std::sort(str.begin(),str.end());
m[str]++;
}
for(const auto& [k,v] : m) count += (v * (v-1)) / 2;
return count;
}
int main()
{
std::vector<std::string> vec1{"aba","aabb","abcd","bac","aabc"},
vec2{"aabb","ab","ba"},vec3{"nba","cba","dba"};
std::cout << similar_words(vec1) << '\n';
std::cout << similar_words(vec2) << '\n';
std::cout << similar_words(vec3) << '\n';
return 0;
}
|