# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
977476 |
2024-05-08T03:47:39 Z |
vjudge1 |
Lampice (COCI19_lampice) |
C++17 |
|
4287 ms |
28732 KB |
#include<bits/stdc++.h>
using namespace std;
unordered_map<int,int> mp[25010];
#define N 50010
#define int long long
int palin[N],vis[N],pw[N],hsh[N],sz[N],val[N],ans,rt,B=31,mod=1e9+7;
vector<int>adj[N],V{0};
void dfssz(int n,int p,int tot){
palin[n]=0;
int mx=0;
sz[n]=1;
for(auto i:adj[n])
if(i-p&&!vis[i]) {
dfssz(i,n,tot),
sz[n]+=sz[i],
mx=max(mx,sz[i]);
}
if(sz[n]*2>=tot&&mx*2<=tot)
rt=n;
}
void dfshash(int n,int p){
hsh[n]=(hsh[p]*B+val[n])%mod;
for(auto i:adj[n])
if(!vis[i]&&i-p)
dfshash(i,n);
}
int MD;
void calcdfs(int n,int p,int l,int d,int h){
MD=max(MD,d);
if(d>l||ans) return;
ans|=mp[d][(hsh[n]-val[V[1]]*pw[d]%mod+mod)%mod];
h=(h+pw[d]*val[n])%mod;
palin[n]=hsh[n]==h;
for(auto i:adj[n])
if(!vis[i]&&i-p)
calcdfs(i,n,l,d+1,h);
}
void upddfs(int n,int p,int l,int d){
if(ans||d>l) return;
V.push_back(n);
int c;
if(d+l/2>=l&&palin[c=V[2*d-l]])
mp[l-d][(hsh[n]-hsh[c]*pw[l-d]%mod+mod)%mod]=1;
for(auto i:adj[n])
if(i-p&&!vis[i])
upddfs(i,n,l,d+1);
V.pop_back();
}
void cent(int n,int s,int l){
if(ans)
return;
MD=0;
dfssz(n,0,s);
dfssz(n=rt,0,s);
palin[n]=1;
dfshash(n,0);
vis[n]=1;
V.push_back(n);
for(auto i:adj[n]) if(!vis[i])
calcdfs(i,n,l,1,val[n]),
upddfs(i,n,l,2);
if(mp[0][0])
ans=1;
for(int i=0;i<=min(l/2,MD);i++)
mp[i].clear();
reverse(adj[n].begin(),adj[n].end());
for(auto i:adj[n]) if(!vis[i])
calcdfs(i,n,l,1,val[n]),
upddfs(i,n,l,2);
if(mp[0][0])
ans=1;
for(int i=0;i<=min(l/2,MD);i++)
mp[i].clear();
V.pop_back();
for(auto i:adj[n])
if(!vis[i])
cent(i,sz[i],l);
}
signed main() {
pw[0]=1;
for(int i=1;i<N;i++)
pw[i]=pw[i-1]*B%mod;
cin.tie(0)->sync_with_stdio(0);
int n;
string str;
cin>>n>>str;
for(int i=1;i<=n;i++)
val[i]=str[i-1]-'`';
if(n==1)
return puts("1"),0;
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
adj[a].push_back(b);
adj[b].push_back(a);
}
int l=0,r=n/2;
while(l<r){
int mid=l+r+1>>1;
for(int i=1;i<=n;i++)
palin[i]=vis[i]=ans=0;
cent(1,n,mid*2+1);
if(ans)
l=mid;
else r=mid-1;
}
int l1=l,r1=n/2;
while(l1<r1){
int mid=l1+r1+1>>1;
for(int i=1;i<=n;i++)
palin[i]=vis[i]=ans=0;
cent(1,n,mid*2);
if(ans)
l1=mid;
else r1=mid-1;
}
cout<<max(l1*2,l*2+1)<<'\n';
}
Compilation message
lampice.cpp: In function 'int main()':
lampice.cpp:99:20: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
99 | int mid=l+r+1>>1;
| ~~~^~
lampice.cpp:109:22: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
109 | int mid=l1+r1+1>>1;
| ~~~~~^~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
5 ms |
5212 KB |
Output is correct |
2 |
Correct |
10 ms |
5300 KB |
Output is correct |
3 |
Correct |
42 ms |
5760 KB |
Output is correct |
4 |
Correct |
41 ms |
5468 KB |
Output is correct |
5 |
Correct |
2 ms |
5212 KB |
Output is correct |
6 |
Correct |
2 ms |
5212 KB |
Output is correct |
7 |
Correct |
1 ms |
5212 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2080 ms |
28732 KB |
Output is correct |
2 |
Correct |
1734 ms |
14800 KB |
Output is correct |
3 |
Correct |
1024 ms |
14796 KB |
Output is correct |
4 |
Correct |
1119 ms |
15192 KB |
Output is correct |
5 |
Correct |
1791 ms |
18668 KB |
Output is correct |
6 |
Correct |
164 ms |
14672 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
4287 ms |
26964 KB |
Output is correct |
2 |
Correct |
3035 ms |
11632 KB |
Output is correct |
3 |
Correct |
3461 ms |
12228 KB |
Output is correct |
4 |
Correct |
3215 ms |
10168 KB |
Output is correct |
5 |
Correct |
2907 ms |
9580 KB |
Output is correct |
6 |
Correct |
2733 ms |
11640 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
5 ms |
5212 KB |
Output is correct |
2 |
Correct |
10 ms |
5300 KB |
Output is correct |
3 |
Correct |
42 ms |
5760 KB |
Output is correct |
4 |
Correct |
41 ms |
5468 KB |
Output is correct |
5 |
Correct |
2 ms |
5212 KB |
Output is correct |
6 |
Correct |
2 ms |
5212 KB |
Output is correct |
7 |
Correct |
1 ms |
5212 KB |
Output is correct |
8 |
Correct |
2080 ms |
28732 KB |
Output is correct |
9 |
Correct |
1734 ms |
14800 KB |
Output is correct |
10 |
Correct |
1024 ms |
14796 KB |
Output is correct |
11 |
Correct |
1119 ms |
15192 KB |
Output is correct |
12 |
Correct |
1791 ms |
18668 KB |
Output is correct |
13 |
Correct |
164 ms |
14672 KB |
Output is correct |
14 |
Correct |
4287 ms |
26964 KB |
Output is correct |
15 |
Correct |
3035 ms |
11632 KB |
Output is correct |
16 |
Correct |
3461 ms |
12228 KB |
Output is correct |
17 |
Correct |
3215 ms |
10168 KB |
Output is correct |
18 |
Correct |
2907 ms |
9580 KB |
Output is correct |
19 |
Correct |
2733 ms |
11640 KB |
Output is correct |
20 |
Correct |
1838 ms |
8016 KB |
Output is correct |
21 |
Correct |
2122 ms |
9612 KB |
Output is correct |
22 |
Correct |
3328 ms |
9204 KB |
Output is correct |
23 |
Correct |
645 ms |
7764 KB |
Output is correct |
24 |
Correct |
2497 ms |
9668 KB |
Output is correct |
25 |
Correct |
3262 ms |
8536 KB |
Output is correct |
26 |
Correct |
4069 ms |
11408 KB |
Output is correct |
27 |
Correct |
4125 ms |
20036 KB |
Output is correct |
28 |
Correct |
2645 ms |
7428 KB |
Output is correct |
29 |
Correct |
2534 ms |
7472 KB |
Output is correct |
30 |
Correct |
3202 ms |
10144 KB |
Output is correct |
31 |
Correct |
2969 ms |
8452 KB |
Output is correct |
32 |
Correct |
2584 ms |
11464 KB |
Output is correct |
33 |
Correct |
1539 ms |
8888 KB |
Output is correct |