#include<bits/stdc++.h>
#define fi first
#define se second
#define int long long
using namespace std;
using ll = long long;
using ii = pair<ll, ll>;
using aa = array<int,10>;
const int N = 2e5+5;
const int INF = 1e9;
const int base=311;
const int MOD=1e9+7;
int binpow(int a,int b) {
int res=1;
while(b>0) {
if(b & 1) res=res * a % MOD;
a=a*a% MOD;
b/=2;
}
return res;
}
int n;
int del[100005];
vector<int> adj[100005];
int s[100005];
int a[200005];
map<int,int> mp[100005];
int res,mid,lmao;
int dfs(int u,int p) {
s[u]=1;
for(int v:adj[u]) {
if(del[v] || v==p) continue;
s[u]+=dfs(v,u);
}
return s[u];
}
int centroid(int u,int p,int tsz) {
for(int v:adj[u]) {
if(del[v] || v==p) continue;
if(s[v]*2>tsz) return centroid(v,u,tsz);
}
return u;
}
void get(int u,int p,int cur,int val1,int val2,int type) {
if(cur>mid-type) return;
int tmp=(val1-(val2*binpow(base,mid-cur)%MOD)+MOD)%MOD;
if(!type) {
res|=mp[mid-cur].count(tmp);
}
else {
lmao=max(lmao,cur);
mp[cur][tmp]=1;
}
//cout << u<< ' ' << cur << ' ' << tmp << ' ' << val1 << ' ' << val2 << ' ' << res << ' ' << type << endl;
for(int v:adj[u]) {
if(del[v] || v==p) continue;
get(v,u,cur+1,(val1*base+a[v])%MOD,(val2+a[v]*binpow(base,cur))%MOD,type);
}
}
void build(int u) {
int cen=centroid(u,-1,dfs(u,-1));
del[cen]=1;
lmao=0;
mp[0][0]=1;
for(int v:adj[cen]) {
if(del[v]) continue;
get(v,cen,2,a[cen]*base+a[v],a[v]*base+a[cen],0);
get(v,cen,1,a[v],a[v],1);
}
for(int i=1;i<=lmao;i++) {
mp[i].clear();
}
//cout << cen << ' ' << lmao << ' ' << mp[1][999806567] << endl;
//return;
for(int v:adj[cen]) {
if(del[v]) continue;
build(v);
if(res) return;
}
}
bool check() {
res=0;
for(int i=1;i<=n;i++) del[i]=0;
build(1);
return res;
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
for(int i=1;i<=n;i++) {
char x; cin >> x;
a[i]=(x-'a')+1;
}
for(int i=1;i<n;i++) {
int u,v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
int ans=1,l=1,r=n/2;
while(l<=r) {
mid=(l+r)/2;
mid*=2;
if(check()) {
ans=mid;
l=mid/2+1;
}
else r=mid/2-1;
}
l=ans/2+1,r=(n+1)/2;
while(l<=r) {
mid=(l+r)/2;
mid=mid*2-1;
//cout << mid << endl;
if(check()) {
ans=max(ans,mid);
l=(mid+1)/2+1;
}
else r=(mid+1)/2-1;
}
cout << ans;
return 0;
}
/*
██╗░░██╗██╗░░██╗░█████╗░███╗░░██╗░██████╗░ ░██████╗██╗██╗░░░██╗ ░█████╗░██╗░░░██╗████████╗███████╗
██║░██╔╝██║░░██║██╔══██╗████╗░██║██╔════╝░ ██╔════╝██║██║░░░██║ ██╔══██╗██║░░░██║╚══██╔══╝██╔════╝
█████═╝░███████║███████║██╔██╗██║██║░░██╗░ ╚█████╗░██║██║░░░██║ ██║░░╚═╝██║░░░██║░░░██║░░░█████╗░░
██╔═██╗░██╔══██║██╔══██║██║╚████║██║░░╚██╗ ░╚═══██╗██║██║░░░██║ ██║░░██╗██║░░░██║░░░██║░░░██╔══╝░░
██║░╚██╗██║░░██║██║░░██║██║░╚███║╚██████╔╝ ██████╔╝██║╚██████╔╝ ╚█████╔╝╚██████╔╝░░░██║░░░███████╗
╚═╝░░╚═╝╚═╝░░╚═╝╚═╝░░╚═╝╚═╝░░╚══╝░╚═════╝░ ╚═════╝░╚═╝░╚═════╝░ ░╚════╝░░╚═════╝░░░░╚═╝░░░╚══════╝
*/
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |