-
Notifications
You must be signed in to change notification settings - Fork 0
/
uva599.cpp
119 lines (89 loc) · 2.74 KB
/
uva599.cpp
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
class UFDS{
vector<int> parent;
public:
unordered_map<char, int> letters;
UFDS(int size, const string& ls){
parent.assign(size, -1);
for(int i = 0; i < ls.size(); i++){
letters.emplace(ls[i], i);
}
}
int findGrandParent(int x){
if(parent[x] < 0){
return x;
}
parent[x] = findGrandParent(parent[x]);
return parent[x];
}
void unit(int x, int y){
int xParent = findGrandParent(x), yParent = findGrandParent(y);
if(xParent == yParent){
return;
}
int biggerParent = parent[xParent] > parent[yParent] ? yParent : xParent,
smallerParent = parent[xParent] <= parent[yParent] ? yParent : xParent;
int unionNegativeSize = parent[xParent] + parent[yParent];
parent[biggerParent] = unionNegativeSize;
parent[smallerParent] = biggerParent;
}
int getSetSize(int x){
if(parent[x] < 0){
return -parent[x];
}
return getSetSize(parent[x]);
}
void count(){
int trees(0), acrons(0);
for(int i = 0; i < parent.size(); i++){
if(parent[i] < -1){
trees++;
}else if(parent[i] == -1){
acrons++;
}
}
cout<<"There are "<<trees<<" tree(s) and "<<acrons<<" acorn(s)."<<endl;
}
};
int main(){
int tc;
cin>>tc;
while(tc--){
vector<string> edges;
string edge;
while(getline(cin>>ws, edge) && edge[0] != '*'){
string cleanEdge = "";
for(int i = 0; i < edge.size() && cleanEdge.size() < 2; i++){
if(edge[i] >= 'A' && edge[i] <= 'Z'){
cleanEdge += edge[i];
}
}
edges.push_back(cleanEdge);
}
string lettersList, letters;
getline(cin>>ws, lettersList);
for(int i = 0; i < lettersList.size(); i++){
if(lettersList[i] >= 'A' && lettersList[i] <= 'Z'){
letters += lettersList[i];
}
}
UFDS forest = UFDS(letters.size(), letters);
for(int i = 0; i < edges.size(); i++){
forest.unit(forest.letters[edges[i][0]], forest.letters[edges[i][1]]);
}
forest.count();
}
return 0;
}
// ds 3 solved in 58min and 44sec
// why it took me so long??
/*
first i know an easier solution for this, but i prefered to use UFDS to
learn better about them
second, i added a debugging statement and i forgot to remove it when
submitting, it took me a while to notice it, i would solve the
challenge in 30 min if i didn't add that statement
*/