2
vector<int> parent, size;4
vector<int> Q{'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p',5
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'};6
vector<int> A{'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l',7
'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L'};8
vector<int> Z{'z', 'x', 'c', 'v', 'b', 'n', 'm', 'Z', 'X', 'C', 'V', 'B', 'N', 'M'};12
for (int i = 0; i < 123; i++) parent.push_back(i), size.push_back(1);13
for (int i = 0; i < Q.size() - 1; i++) findUnion(Q[i], Q[i + 1]);14
for (int i = 0; i < A.size() - 1; i++) findUnion(A[i], A[i + 1]);15
for (int i = 0; i < Z.size() - 1; i++) findUnion(Z[i], Z[i + 1]);18
int findParent(int x) {19
if (x == parent[x]) return x;20
return parent[x] = findParent(parent[x]);23
void findUnion(int a, int b) {27
if (size[b] > size[a]) swap(a, b);28
parent[b] = a, size[a] += size[b];34
vector<string> findWords(vector<string> &words) {38
for (int i = 0; i < n; i++) {39
int ss = words[i].size();47
for (int j = 0; j < ss - 1; j++)48
if (dsu.findParent(s[j]) != dsu.findParent(s[j + 1])) {52
if (sameSet) ans.push_back(s);