제출 #994130

#제출 시각아이디문제언어결과실행 시간메모리
994130vjudge1Rima (COCI17_rima)C++17
56 / 140
813 ms76908 KiB
#include <bits/stdc++.h> using namespace std; const int N = 3e5; #define int long long bool not_pr[N]; signed main() { ios::sync_with_stdio(0); cin.tie(NULL),cout.tie(NULL); vector<long long> hashes,modes={(int)1e9+7,(int)1e9+9,998244353,1LL<<36,1LL<<45}; for (int i=2;i<N;i++) for (int j=i+i;j<N;j+=i) not_pr[j]=true; for (int i=200;i<N;i++) if (!not_pr[i]) { hashes.push_back(i); i+=100; } srand(time(NULL)); long long h=hashes[rand()%2725]; int mod = modes[rand()%5]; int n; cin>>n; map<int,vector<string>> mp; unordered_set<int> se; se.reserve(n+369); for (int i=0;i<n;i++) { string s; cin>>s; reverse(s.begin(),s.end()); mp[s.size()].push_back(s); int m=s.size(),hs=0; for (int j=0;j<m;j++) hs=(hs*h+s[j])%mod; se.insert(hs); } vector<string> v; for (auto i:mp) for (auto j:i.second) v.push_back(j); reverse(v.begin(),v.end()); unordered_map<int,int> ans; ans.reserve(n+369); while (!v.empty()) { string s=v.back(); v.pop_back(); int m=s.size(); int hs=0,mx=0; for (int i=0;i<m-1;i++) hs=(hs*h+s[i])%mod; if (ans.find(hs)!=ans.end()) mx=ans[hs]; for (int c='a';c<='z';c++) { if (se.find((hs*h+c)%mod)!=se.end()) mx++; } ans[(hs*h+s[m-1])%mod]=mx; } int res=0; for (auto i:ans) res=max(res,i.second); cout<<res<<endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...