Submission #1256949

#TimeUsernameProblemLanguageResultExecution timeMemory
1256949nhphucLampice (COCI19_lampice)C++20
17 / 110
2518 ms12928 KiB
#include <bits/stdc++.h> using namespace std; const int N = 50007; const unsigned long long base = 311; int n, sub[N], dep[N]; bool del[N]; char a[N]; vector<int> adj[N]; unsigned long long pw[N], up[N], dw[N]; map<unsigned long long, bool> mp[N]; void dfs (int u, int p = 0){ sub[u] = 1; for (int v : adj[u]){ if (v != p && !del[v]){ dfs(v, u); sub[u] += sub[v]; } } return; } int findCentroid (int u, int sz, int p = 0){ for (int v : adj[u]){ if (v != p && !del[v] && sub[v] * 2 > sz){ return findCentroid(v, sz, u); } } return u; } void dfsHash (int u, int p = 0, int d = 1){ if (p != 0){ dw[u] = dw[p] * base + 1ull * (int)(a[u]); } up[u] = up[p] + 1ull * (int)(a[u]) * pw[d - 1]; dep[u] = d; for (int v : adj[u]){ if (v != p && !del[v]){ dfsHash(v, u, d + 1); } } return; } bool dfsSolve (int u, int p, int len){ if (dep[u] > len){ return false; } unsigned long long f = up[u] * pw[len - dep[u]] - dw[u]; if (mp[len - dep[u] + 1].count(f)){ return true; } for (int v : adj[u]){ if (v != p && !del[v]){ if (dfsSolve(v, u, len)){ return true; } } } return false; } int mx; void dfsAdd (int u, int p, int len){ if (dep[u] > len){ return; } unsigned long long f = up[u] * pw[len - dep[u]] - dw[u]; mp[dep[u]][f] = true; mx = max(mx, dep[u]); for (int v : adj[u]){ if (v != p && !del[v]){ dfsAdd(v, u, len); } } return; } bool centroid (int u, int len){ dfs(u); u = findCentroid(u, sub[u]); dfsHash(u); mx = 0; mp[1][up[u] * pw[len - dep[u]] - dw[u]] = true; for (int v : adj[u]){ if (!del[v]){ if (dfsSolve(v, u, len)){ return true; } dfsAdd(v, u, len); } } for (int i = 1; i <= mx; ++i){ mp[i].clear(); } del[u] = true; for (int v : adj[u]){ if (!del[v]){ if (centroid(v, len)){ return true; } } } return false; } int32_t main (){ ios::sync_with_stdio(false); cin.tie(nullptr); const string task = "test"; if (fopen ((task + ".inp").c_str(), "r")){ freopen ((task + ".inp").c_str(), "r", stdin); freopen ((task + ".out").c_str(), "w", stdout); } pw[0] = 1ull; for (int i = 1; i < N; ++i){ pw[i] = pw[i - 1] * base; } cin >> n; for (int i = 1; i <= n; ++i){ cin >> a[i]; } for (int i = 1; i < n; ++i){ int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } int l = 1, r = (n >> 1), ans = 1; while (l <= r){ int m = l + r >> 1; for (int i = 1; i <= n; ++i){ del[i] = false; } if (centroid(1, m * 2)){ ans = max(ans, m * 2); l = m + 1; } else { r = m - 1; } } l = 1; r = ((n - 1) >> 1); while (l <= r){ int m = l + r >> 1; for (int i = 1; i <= n; ++i){ del[i] = false; } if (centroid(1, m * 2 + 1)){ ans = max(ans, m * 2 + 1); l = m + 1; } else { r = m - 1; } } cout << ans << "\n"; }

Compilation message (stderr)

lampice.cpp: In function 'int32_t main()':
lampice.cpp:115:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  115 |         freopen ((task + ".inp").c_str(), "r", stdin);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lampice.cpp:116:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  116 |         freopen ((task + ".out").c_str(), "w", stdout);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...