#include <bits/stdc++.h>
#define int long long
using namespace std;
#define fod(i,a,b) for(int i = (int) (a); i <= (int) (b); i++)
#define fok(i,a,b) for(int i = (int) (a); i >= (int) (b); i--)
#define ll long long
#define pb push_back
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
#define el '\n'
#define ve vector
#define vi ve<int>
#define vll ve<ll>
#define mask(a) (1LL<<(a))
#define BIT(msk,i) (msk>>(i)&1LL)
using namespace std;
template <class T> bool mini(T &a, T b){ return (a > (b)) ? a = (b), 1 : 0; }
template <class T> bool maxi(T &a, T b){ return (a < (b)) ? a = (b), 1 : 0; }
#define name "lampice"
mt19937 rng((uint64_t) new char);
ll rd(ll l, ll r){
return uniform_int_distribution<ll>(l, r)(rng);
}
int n;
ve <vi> g;
const int N = 5e4;
char a[N + 5];
const int MOD = 1e9 + 3777;
const int base = 333;
int sz[N + 5];
bool del[N + 5];
void find_size(int u, int p){
sz[u] = 1;
for(int v : g[u]) if(v != p and !del[v]) find_size(v, u), sz[u] += sz[v];
}
int root_size = 0;
int get_cent(int u, int p){
for(int v : g[u]) if(v != p and !del[v] and 2 * sz[v] > root_size) return get_cent(v, u);
return u;
}
int base_pw[N + 5];
struct Node{
int u;
int cur, rev;
};
int sz_nodes = 0;
Node nodes[N + 5];
int len = 0;
/*
cur, rev: current string and its reversed string
cur_, rev_: another string
khi merge 2 đoạn thẳng ta được palindrome khi:
result_cur = result_rev
<=> rev * base^(len-h[u]) + cur_ = rev_ * base^(h[u]+1) + cur
<=> rev_ * base^(h[u]) - cur_ = rev * base^(len-h[u]) - cur
*/
int h[N + 5], cur[N + 5], rev[N + 5];
unordered_set <int> f[N + 5];
bool found = 0;
void dfs(int u, int p, bool ok){
if(!ok){
h[u] = h[p] + 1;
cur[u] = (1LL * cur[p] * base % MOD + a[u]) % MOD;
rev[u] = (1LL * a[u] * base_pw[h[u]] % MOD + rev[p]) % MOD;
int x = (1LL * rev[u] * base_pw[len - h[u]] - cur[u]) % MOD;
if(x < 0) x += MOD;
if(cur[u] == rev[u] and h[u] + 1 == len){
found = 1;
return;
}
if(f[len - h[u] - 1].find(x) != f[len - h[u]- 1].end()){
found = 1;
return;
}
}
else{
int x = (1LL * rev[u] * base_pw[len - h[u]] - cur[u]) % MOD;
if(x < 0) x += MOD;
f[h[u]].insert(x);
}
if(h[u] == len - 1) return;
for(int v : g[u]) if(v != p and !del[v]){
dfs(v, u, ok);
if(found) return;
}
}
bool solve_tree(int r){
fod(i,0,len) f[i].clear();
h[r] = 0;
cur[r] = rev[r] = a[r];
found = 0;
for(int v : g[r]) if(!del[v]){
dfs(v, r, 0);
if(found) return 1;
dfs(v, r, 1);
}
return 0;
}
bool dec(int u){
find_size(u, 0);
root_size = sz[u];
int c = get_cent(u, 0);
if(solve_tree(c)) return 1;
del[c] = 1;
for(int v : g[c]) if(!del[v]){
if(dec(v)) return 1;
}
return 0;
}
bool check(int l){
if(l > n) return 0;
if(l == 1) return 1;
len = l;
fod(i,0,n) del[i] = 0;
return dec(1);
}
signed main(){
ios_base::sync_with_stdio(false); cin.tie(0);
cin >> n;
fod(i,1,n) cin >> a[i], a[i] -= 96;
{
g.resize(n + 1);
int u, v;
fod(i,1,n-1){
cin >> u >> v;
g[u].pb(v);
g[v].pb(u);
}
}
base_pw[0] = 1;
fod(i,1,n) base_pw[i] = 1LL * base_pw[i-1] * base % MOD;
// cout << check(4) << el;
int res = 0;
int l = 0, r = n;
while(l <= r){
int mid = l + r >> 1;
if(check(2 * mid + 1)) maxi(res, 2 * mid + 1), l = mid + 1;
else r = mid - 1;
}
l = 1, r = n;
while(l <= r){
int mid = l + r >> 1;
if(check(2 * mid)) maxi(res, 2 * mid), l = mid + 1;
else r = mid - 1;
}
cout << res;
return 0;
}
Compilation message
lampice.cpp: In function 'int main()':
lampice.cpp:178:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
178 | int mid = l + r >> 1;
| ~~^~~
lampice.cpp:185:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
185 | int mid = l + r >> 1;
| ~~^~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
4 ms |
3164 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
5036 ms |
14172 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
5100 ms |
11864 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
4 ms |
3164 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |