Submission #921145

#TimeUsernameProblemLanguageResultExecution timeMemory
921145Beerus13Lampice (COCI19_lampice)C++14
110 / 110
4881 ms63892 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long const int N = 5e4 + 5; const int mod = 1e9 + 7; const int base = 31; int n, sz[N], Pow[N]; string s; vector<int> g[N]; bool del[N]; unordered_map<int, bool> mp[N]; int mx, centroid, len; int dfs_size(int u, int p = 0) { sz[u] = 1; for(int v : g[u]) if(v != p && !del[v]) { sz[u] += dfs_size(v, u); } return sz[u]; } int find_centroid(int u, int p, int num) { for(int v : g[u]) if(v != p && !del[v] && sz[v] > num / 2) return find_centroid(v, u, num); return u; } void dfs_centroid(int u, int p, bool upd, int dep, int up, int down, bool &found) { up = (1ll * up * base + s[u] - 'a' + 1) % mod; down = (down + 1ll * Pow[dep - 1] * (s[u] - 'a' + 1)) % mod; int val = (1ll * down * Pow[len - dep] - up) % mod; if(val < 0) val += mod; if(upd) mp[dep][val] = 1; else { if(dep + 1 == len && up == (1ll * down * base + s[centroid] - 'a' + 1) % mod) { found = 1; return; } if(dep < len && mp[len - dep - 1][val]) { found = 1; return; } } if(dep < len) { for(int v : g[u]) if(v != p && !del[v]) { dfs_centroid(v, u, upd, dep + 1, up, down, found); mx = max(mx, dep + 1); if(found) return; } } } void calc(int u, bool &found) { centroid = find_centroid(u, 0, dfs_size(u)); del[centroid] = 1; mx = 1; for(int v : g[centroid]) if(!del[v]) { dfs_centroid(v, centroid, 0, 1, s[centroid] - 'a' + 1, 0, found); if(found) return; dfs_centroid(v, centroid, 1, 1, s[centroid] - 'a' + 1, 0, found); } for(int i = 0; i <= mx; ++i) mp[i].clear(); for(int v : g[centroid]) if(!del[v]) { calc(v, found); if(found) return; } } bool check(int x) { for(int i = 0; i <= n; ++i) mp[i].clear(); memset(del, 0, sizeof(del)); bool found = 0; len = x; calc(1, found); return found; } void solve() { cin >> n >> s; s = ' ' + s; Pow[0] = 1; for(int i = 1; i <= n; ++i) Pow[i] = (1ll * Pow[i - 1] * base) % mod; for(int i = 1, u, v; i < n; ++i) { cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } int ans = 1; for(int i = 0; i < 2; ++i) { int l = 0, r = n / 2 + 1; while(r - l > 1) { int m = l + r >> 1; if(check(i + 2 * m)) l = m; else r = m; } ans = max(ans, i + 2 * l); } cout << ans << '\n'; } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int test = 1; // cin >> test; while(test--) solve(); return 0; } // https://oj.uz/problem/view/COCI19_lampice

Compilation message (stderr)

lampice.cpp: In function 'void solve()':
lampice.cpp:89:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   89 |             int m = l + r >> 1;
      |                     ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...