# | Submission time | Handle | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
240079 | 2020-06-18T00:39:41 Z | luciocf | Rima (COCI17_rima) | C++14 | 549 ms | 139896 KB |
#include <bits/stdc++.h> using namespace std; const int maxn = 3e6+10; struct Node { Node *b[26]; int u; bool fim; }; int cnt; int dp[maxn]; void add(Node *t, string s) { Node *at = t; for (auto c: s) { if (!at->b[c-'a']) { at->b[c-'a'] = new Node(); at->b[c-'a']->u = ++cnt; } at = at->b[c-'a']; } at->fim = true; } void dfs(Node *t) { int mx1 = -1, mx2 = -1; int tot = (t->fim); for (int i = 0; i < 26; i++) { if (!t->b[i]) continue; dfs(t->b[i]); if (t->b[i]->fim) { int x = dp[t->b[i]->u]; if (x > mx1) mx2 = mx1, mx1 = x; else if (x > mx2) mx2 = x; tot++; } } dp[t->u] = tot; if (mx2 != -1) dp[t->u] = mx1 + mx2 + tot-2; else if (mx1 != -1) dp[t->u] = mx1 + tot-1; } int main(void) { Node *root = new Node(); root->u = 0; int n; scanf("%d", &n); for (int i = 1; i <= n; i++) { string s; cin >> s; reverse(s.begin(), s.end()); add(root, s); } dfs(root); int ans = 0; for (int i = 0; i < maxn; i++) ans = max(ans, dp[i]); printf("%d\n", ans); }
Compilation message
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
1 | Correct | 10 ms | 512 KB | Output is correct |
2 | Correct | 10 ms | 384 KB | Output is correct |
3 | Correct | 10 ms | 384 KB | Output is correct |
4 | Incorrect | 549 ms | 139896 KB | Output isn't correct |
5 | Correct | 155 ms | 3832 KB | Output is correct |
6 | Incorrect | 116 ms | 87348 KB | Output isn't correct |
7 | Incorrect | 111 ms | 87096 KB | Output isn't correct |
8 | Incorrect | 115 ms | 86840 KB | Output isn't correct |
9 | Incorrect | 251 ms | 92600 KB | Output isn't correct |
10 | Incorrect | 111 ms | 86876 KB | Output isn't correct |