forked from ngthanhtrung23/CompetitiveProgramming
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathA.cpp
More file actions
126 lines (109 loc) · 2.7 KB
/
A.cpp
File metadata and controls
126 lines (109 loc) · 2.7 KB
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
120
121
122
123
124
125
126
#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; ++i)
#define FORD(i,a,b) for(int i=(a),_b=(b); i>=_b; --i)
#define REP(i,a) for(int i=0,_a=(a); i < _a; ++i)
#define DEBUG(X) { cout << #X << " = " << X << endl; }
#define PR(A,n) { cout << #A << " = "; FOR(_,1,n) cout << A[_] << ' '; cout << endl; }
#define PR0(A,n) { cout << #A << " = "; REP(_,n) cout << A[_] << ' '; cout << endl; }
#define sqr(x) ((x) * (x))
#define ll long long
#define SZ(x) ((int) (x).size())
using namespace std;
const int MN = 100111;
bool allSame(const string& s) {
for(char c : s) if (c != s[0]) return false;
return true;
}
struct Str {
string x;
int rep;
ll len;
bool all;
ll firstEqual, lastEqual;
friend istream& operator >> (istream& cin, Str& a) {
cin >> a.x >> a.rep;
a.len = SZ(a.x) * a.rep;
if (allSame(a.x)) {
a.all = true;
a.firstEqual = a.lastEqual = -1;
}
else {
a.all = false;
a.firstEqual = 1;
while (a.x[ a.firstEqual ] == a.x[0]) ++a.firstEqual;
a.lastEqual = 1;
while (a.x[ SZ(a.x) - a.lastEqual - 1 ] == a.x.back()) ++a.lastEqual;
}
return cin;
}
} a[MN];
vector<int> ke[MN];
int n;
pair<ll,int> res;
int digit(char c) {
return - (c - '0');
}
void update(int u, pair<ll,int>& cur) {
if (a[u].all) {
if (digit(a[u].x[0]) == cur.second) {
cur.first += a[u].len;
}
else {
cur.first = a[u].len;
cur.second = digit(a[u].x[0]);
}
}
else {
if (digit(a[u].x[0]) == cur.second) {
cur.first += a[u].firstEqual;
res = max(res, cur);
}
cur.first = a[u].lastEqual;
cur.second = digit(a[u].x.back());
}
}
void dfs(int u, int fu, pair<ll,int>& cur) {
// add a[u]
update(u, cur);
res = max(res, cur);
for(int v : ke[u]) {
if (v == fu) continue;
dfs(v, u, cur);
// add a[u]
update(u, cur);
res = max(res, cur);
}
}
int main() {
ios :: sync_with_stdio(0); cin.tie(0);
while (cin >> n) {
res = make_pair(0, 0);
FOR(i,1,n) {
cin >> a[i];
if (a[i].all) res = max(res, make_pair(a[i].len, digit(a[i].x[0])));
else {
int cur = -1, len = 0;
for(char c : a[i].x) {
int u = c - '0';
if (u == cur) ++len;
else len = 1, cur = u;
res = max(res, make_pair((ll) len, -u));
}
if (a[i].rep > 1) {
if (a[i].x[0] == a[i].x.back()) {
res = max(res, make_pair(a[i].firstEqual + a[i].lastEqual, digit(a[i].x[0])));
}
}
}
}
FOR(i,1,n) ke[i].clear();
FOR(i,2,n) {
int u, v; cin >> u >> v;
ke[u].push_back(v);
ke[v].push_back(u);
}
pair<ll,int> cur = make_pair(0LL, 99);
dfs(1, -1, cur);
cout << -res.second << ' ' << res.first << endl;
}
}