Submission #245002

#TimeUsernameProblemLanguageResultExecution timeMemory
245002VEGAnnRima (COCI17_rima)C++14
56 / 140
257 ms19164 KiB
#include <bits/stdc++.h> #define all(x) x.begin(),x.end() #define sz(x) ((int)x.size()) using namespace std; const int N = 500100; const int NN = 18; string s[N]; int n, ans = 0; bool mem[NN][NN], f[(1 << NN)][NN]; bool ok(int i, int j){ int ned = max(sz(s[i]), sz(s[j])) - 1; int lf = 0; while (lf < min(sz(s[i]), sz(s[j])) && s[i][lf] == s[j][lf]) lf++; return bool(lf >= ned); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); #ifdef _LOCAL freopen("in.txt","r",stdin); #endif // _LOCAL cin >> n; for (int i = 0; i < n; i++){ cin >> s[i]; reverse(all(s[i])); } if (n <= 18){ for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) mem[i][j] = mem[j][i] = ok(i, j); for (int i = 0; i < n; i++) f[(1 << i)][i] = 1; for (int msk = 1; msk < (1 << n); msk++) for (int lst = 0; lst < n; lst++){ if (!f[msk][lst]) continue; int cnt = __builtin_popcount(msk); ans = max(ans, cnt); for (int i = 0; i < n; i++) if (!(msk & (1 << i)) && mem[lst][i]) f[msk + (1 << i)][i] = 1; } cout << ans; return 0; } sort(s, s + n); for (int i = 0; i < n; ){ int j = i + 1; while (j < n && ok(j - 1, j)) j++; ans = max(ans, j - i); i = j; } cout << ans; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...