#include <bits/stdc++.h>
using namespace std;
#define int long long
int n;
string s;
vector <vector <int> > g;
vector <int> _sz, h;
vector <bool> used;
bool flag;
int len;
vector <int> hash1, hash2;
map <pair <int, int>, bool> mp, mp1;
vector <int> power;
const int const1 = 1e9 + 7;
void dfs1(int v, int p = -1)
{
_sz[v] = 1;
for(int i = 0; i < g[v].size(); i++)
{
int to = g[v][i];
if(to != p && !used[to])
{
h[to] = h[v] + 1;
dfs1(to, v);
_sz[v] += _sz[to];
}
}
}
void build(int v, int p = -1)
{
for(int i = 0; i < g[v].size(); i++)
{
int to = g[v][i];
if(to != p && !used[to])
{
h[to] = h[v] + 1;
build(to, v);
}
}
}
int centroid(int v, int szall, int p = -1)
{
for(int i = 0; i < g[v].size(); i++)
{
int to = g[v][i];
if(to == p || used[to])
{
continue;
}
if(_sz[to] * 2 > szall)
{
return centroid(to, szall, v);
}
}
return v;
}
vector <pair <int, int> > mass0, mass1;
void dfs2(int v, int p, deque <int> vec)
{
int ourhash = hash1[v];
bool fl = false;
if(vec.size() != 0 && h[v] - h[vec.front()] == len / 2)
{
ourhash -= hash1[vec.front()] * power[len / 2] % const1;
if(hash1[vec.front()] == hash2[vec.front()])
{
fl = true;
}
if(ourhash < 0)
{
ourhash += const1;
}
vec.pop_front();
}
else
{
fl = true;
}
mass0.push_back({ourhash, len - h[v]});
if(fl && mp[{ourhash, len - h[v]}])
{
flag = true;
}
vec.push_back(v);
if(vec.size() != 0 && h[v] - h[vec.front()] == len / 2)
{
vec.pop_front();
}
for(int i = 0; i < g[v].size(); i++)
{
int to = g[v][i];
if(!used[to] && to != p)
{
hash1[to] = hash1[v] * 27 % const1 + s[to] - 'a' + 1;
if(hash1[to] >= const1)
{
hash1[to] -= const1;
}
hash2[to] = hash2[v] + power[h[v]] * (s[to] - 'a' + 1) % const1;
if(hash2[to] >= const1)
{
hash2[to] -= const1;
}
dfs2(to, v, vec);
}
}
}
vector <pair <int, int> > mass;
void dfs3(int v, int p, deque <int> vec)
{
int ourhash = hash1[v];
bool fl = false;
if(vec.size() != 0 && h[v] - h[vec.front()] == len / 2)
{
ourhash -= hash1[vec.front()] * power[len / 2] % const1;
if(ourhash < 0)
{
ourhash += const1;
}
if(hash1[vec.front()] == hash2[vec.front()])
{
fl = true;
}
vec.pop_front();
}
else
{
fl = true;
}
if(fl && mp1[{ourhash, len - (h[v] + 1)}])
{
flag = true;
}
if(fl)
{
mass.push_back({ourhash, h[v] + 1});
mp[{ourhash, h[v] + 1}] = 1;
}
for(int i = 0; i < g[v].size(); i++)
{
int to = g[v][i];
if(to != p && !used[to])
{
hash1[to] = hash1[v] * 27 % const1 + s[to] - 'a' + 1;
if(hash1[to] >= const1)
{
hash1[to] -= const1;
}
hash2[to] = hash2[v] + power[h[to]] * (s[to] - 'a' + 1) % const1;
if(hash2[to] >= const1)
{
hash2[to] -= const1;
}
dfs3(to, v, vec);
}
}
}
void go_to(int v)
{
dfs1(v);
v = centroid(v, _sz[v]);
h[v] = 0;
build(v);
used[v] = 1;
hash1[v] = hash2[v] = s[v] - 'a' + 1;
mp[{s[v] - 'a' + 1, 1}] = 1;
mass.push_back({s[v] -'a' + 1, 1});
for(int i = 0; i <g[v].size(); i++)
{
int to = g[v][i];
if(!used[to])
{
deque <int> st;
hash1[to] = hash2[to] = s[to] - 'a' + 1;
dfs2(to, v, st);
st.push_back(v);
hash1[to] = (s[v] - 'a' + 1) * 27 + (s[to] - 'a' + 1);
hash2[to] = (s[v] - 'a' + 1) + 27 * (s[to] - 'a' + 1);
dfs3(to, v, st);
while(mass0.size() > 0)
{
mp1[mass0.back()] = 1;
mass1.push_back(mass0.back());
mass0.pop_back();
}
}
}
while(mass1.size() > 0)
{
mp1[mass1.back()] = 0;
mass1.pop_back();
}
while(mass.size() > 0)
{
pair <int, int> v = mass.back();
mp[v] = 0;
mass.pop_back();
}
for(int i = 0; i < g[v].size(); i++)
{
int to = g[v][i];
if(!used[to])
{
go_to(to);
}
}
}
signed main(){
// ios_base::sync_with_stdio(false);
// cin.tie(NULL);
// cout.tie(NULL);
cin >> n;
used.resize(n);
_sz.resize(n);
cin >> s;
power.resize(n + 1);
power[0] = 1;
for(int i = 1; i <= n; i++)
{
power[i] = power[i - 1] * 27 % const1;
}
h.resize(n);
hash1.resize(n);
hash2.resize(n);
g.resize(n);
for(int i = 0; i < n - 1; i++)
{
int a, b;
cin >> a >> b;
a--;
b--;
g[a].push_back(b);
g[b].push_back(a);
}
int l = 0, r = n / 2 + 1;
while(r - l > 1)
{
int midd = (r + l) / 2;
len = midd * 2;
for(int i = 0; i < n; i++)
{
used[i] = 0;
}
flag = false;
go_to(0);
if(flag)
{
l = midd;
}
else
{
r = midd;
}
}
int l1 = 0, r1 = n / 2 + 1;
while(r1 - l1 > 1)
{
int midd = (r1 + l1) / 2;
len = midd * 2 + 1;
for(int i = 0; i < n; i++)
{
used[i] = 0;
}
flag = false;
go_to(0);
if(flag)
{
l1 = midd;
}
else
{
r1 = midd;
}
}
cout << max(l * 2, l1 * 2 + 1);
return 0;
}
Compilation message
lampice.cpp: In function 'void dfs1(long long int, long long int)':
lampice.cpp:18:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < g[v].size(); i++)
~~^~~~~~~~~~~~~
lampice.cpp: In function 'void build(long long int, long long int)':
lampice.cpp:31:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < g[v].size(); i++)
~~^~~~~~~~~~~~~
lampice.cpp: In function 'long long int centroid(long long int, long long int, long long int)':
lampice.cpp:43:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < g[v].size(); i++)
~~^~~~~~~~~~~~~
lampice.cpp: In function 'void dfs2(long long int, long long int, std::deque<long long int>)':
lampice.cpp:89:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < g[v].size(); i++)
~~^~~~~~~~~~~~~
lampice.cpp: In function 'void dfs3(long long int, long long int, std::deque<long long int>)':
lampice.cpp:139:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < g[v].size(); i++)
~~^~~~~~~~~~~~~
lampice.cpp: In function 'void go_to(long long int)':
lampice.cpp:168:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i <g[v].size(); i++)
~~~^~~~~~~~~~~~
lampice.cpp:199:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < g[v].size(); i++)
~~^~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
19 ms |
896 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
401 ms |
524292 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5042 ms |
274516 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
19 ms |
896 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |