Submission #718224

#TimeUsernameProblemLanguageResultExecution timeMemory
718224Ahmed57Rima (COCI17_rima)C++14
28 / 140
337 ms262144 KiB
#include <bits/stdc++.h> using namespace std ; //TRIE struct node{ node *nxt[26]; int is = 0; node(){ is = 0; for(int i = 0;i<26;i++){ nxt[i] = NULL; } } }; void inser(string w,node *root){ for(auto ch:w){ if(root->nxt[ch-'a']==NULL){ root->nxt[ch-'a'] = new node(); } root=root->nxt[ch-'a']; } root->is++; } int Nnode = 0; vector<pair<int,int>> adj[3000001]; void build(node *root){ int cur = Nnode; for(int j = 0;j<26;j++){ if(root->nxt[j]!=NULL){ Nnode++; adj[cur].push_back({Nnode,root->nxt[j]->is}); //cout<<root->nxt[j]->is<<endl; build(root->nxt[j]); } } } long long dp[3000001][2]; long long calc(int node,int la,int ch = 0){ if(dp[node][ch]!=-1)return dp[node][ch]; long long ma = 0 , sum = la; ch = (ch|(la>0)); for(auto j:adj[node]){ sum+=j.second; } for(auto j:adj[node]){ if(j.second>0||!ch){ ma = max(ma,calc(j.first,j.second)); } } return dp[node][ch] = max(sum,ma+la); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin>>n; node *root = new node(); while(n--){ string s;cin>>s; reverse(s.begin(),s.end()); inser(s,root); } build(root); memset(dp,-1,sizeof dp); long long all =0; for(int i = 0;i<=Nnode;i++){ all = max(all,calc(i,0,0)); } cout<<all<<endl; return 0 ; }
#Verdict Execution timeMemoryGrader output
Fetching results...