Submission #883914

#TimeUsernameProblemLanguageResultExecution timeMemory
883914chanhchuong123Lampice (COCI19_lampice)C++14
110 / 110
1923 ms14456 KiB
#include <bits/stdc++.h> using namespace std; #define task "" #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() const int MOD = 1e9 + 7; const int MAX = 50005; const int BASE = 256; int n; int len; char cc; int maxH; int sz[MAX]; char a[MAX]; int pw[MAX]; bool rem[MAX]; vector<int> adj[MAX]; unordered_map<int, bool> mp[MAX]; int dfsSZ(int u, int p) { sz[u] = 1; for (int v: adj[u]) if (v != p && !rem[v]) { sz[u] += dfsSZ(v, u); } return sz[u]; } int findCentroid(int u, int p, int n) { for (int v: adj[u]) if (v != p && !rem[v]) { if ((sz[v] << 1) > n) return findCentroid(v, u, n); } return u; } void dfs(int u, int p, bool upd, int h, int up, int dw, bool &found) { up = (1LL * up * BASE + (a[u] - 'a' + 1)) % MOD; dw = (dw + 1LL * pw[h - 1] * (a[u] - 'a' + 1)) % MOD; int value = (1LL * pw[len - h] * dw - up + MOD) % MOD; if (upd) mp[h][value] = true; else { if (h + 1 == len && (1LL * dw * BASE + (cc - 'a' + 1)) % MOD == up) { found = true; return; } if (len > h && mp[len - h - 1].find(value) != mp[len - h - 1].end()) { found = true; return; } } if (h < len) { for (int v: adj[u]) if (v != p && !rem[v]) { dfs(v, u, upd, h + 1, up, dw, found); maxH = max(maxH, h + 1); if (found) return; } } } void solve(int u, int p, bool &found) { int c = findCentroid(u, p, dfsSZ(u, p)); rem[c] = true; maxH = 1; cc = a[c]; for (int v: adj[c]) if (v != p && !rem[v]) { dfs(v, c, 0, 1, a[c] - 'a' + 1, 0, found); if (found) return; dfs(v, c, 1, 1, a[c] - 'a' + 1, 0, found); } for (int i = 0; i <= maxH; ++i) { mp[i].clear(); } for (int v: adj[c]) if (v != p && !rem[v]) { solve(v, u, found); if (found) return; } } bool ok(int x) { for (int i = 0; i <= n; ++i) mp[i].clear(); memset(rem, false, sizeof rem); bool found = false; len = x; solve(1, -1, found); return found; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); if (fopen(task".inp", "r")) { freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } cin >> n; cin >> (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); } pw[0] = 1; for (int i = 1; i <= n; ++i) { pw[i] = 1LL * pw[i - 1] * BASE % MOD; } int ans = 1; for (int i = 0; i < 2; ++i) { int l = 0, r = n / 2 + 1; while (r - l > 1) { int mid = l + r >> 1; if (ok(i + 2 * mid)) l = mid; else r = mid; } ans = max(ans, i + 2 * l); } cout << ans; return 0; }

Compilation message (stderr)

lampice.cpp: In function 'int main()':
lampice.cpp:110:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  110 |             int mid = l + r >> 1;
      |                       ~~^~~
lampice.cpp:92:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   92 |   freopen(task".inp", "r",  stdin);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
lampice.cpp:93:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |   freopen(task".out", "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...