Submission #1253652

#TimeUsernameProblemLanguageResultExecution timeMemory
1253652nhnguyen14Rima (COCI17_rima)C++20
140 / 140
301 ms212848 KiB
#include<bits/stdc++.h> using namespace std; typedef long long LL; #define ii pair<int,int> #define BIT(mask,x) (((mask)>>(x))&(1)) #define MASK(x) ((LL)(1)<<(x)) #define FOR(i,a,b) for(int i = (a),_b=(b); i<=_b;++i) #define FORD(i,a,b) for(int i =(a),_b=(b);i>=_b;--i) template<class X,class Y> bool maximize(X &x,Y y){ if (x<y) return x=y,true; else return false; } template<class X,class Y> bool minimize(X &x,Y y){ if (x>y) return x=y,true; else return false; } mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); int Rand(int l,int r){ return uniform_int_distribution<int>(l,r)(rng); } const int N = (int) 5e5; const int MAXM = (int)4e6; struct Node{ int child[26] = {}; bool exist = false; Node(){ memset(child,-1,sizeof child); exist = false; return; } }; vector<int>ke[MAXM+2]; void add_canh(int u,int v){ ke[u].push_back(v); return; } vector<Node> node; void load_size(){ node.push_back(Node()); return; } void insert_string(string &s,int val){ int root = 0; for(int i = 0; i < (int)s.size(); ++i){ int c = s[i] - 'a'; if (node[root].child[c]==-1) { node[root].child[c] = node.size(); add_canh(root , node[root].child[c]); node.push_back(Node()); } root = node[root].child[c]; } node[root].exist = true; return; } int n; int id[N+2] = {} , dp[MAXM+2] = {} ; int ans = 0; void dfs(int u,int p){ int mx1 = 0 , mx2 = 0; int sum_child = 0; for(auto& v : ke[u]){ if (v==p) continue; dfs(v,u); sum_child += node[v].exist; if (node[v].exist==false) continue; if (mx1 < dp[v]) { mx2 = mx1; mx1 = dp[v]; } else maximize(mx2 , dp[v]); } maximize(ans , sum_child); if (node[u].exist) dp[u] = 1 + mx1 + max(0,sum_child-1); maximize(ans , max(0,sum_child-1) + mx1 + node[u].exist); maximize(ans , max(0 , sum_child - 2) + mx1 + mx2 + node[u].exist); } int main(){ ios::sync_with_stdio(false); cin.tie(0) ; cout.tie(0) ; #define name "main" if (fopen(name".inp","r")){ freopen(name".inp","r",stdin); freopen(name".out","w",stdout); } cin >> n; load_size(); FOR(i,1,n) { string s; cin >> s; reverse(s.begin() , s.end()); insert_string(s,1); } dfs(0,0); cout<<ans; }

Compilation message (stderr)

rima.cpp: In function 'int main()':
rima.cpp:93:32: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |                         freopen(name".inp","r",stdin);
      |                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
rima.cpp:94:32: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |                         freopen(name".out","w",stdout);
      |                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...