Submission #100188

#TimeUsernameProblemLanguageResultExecution timeMemory
100188pamajRima (COCI17_rima)C++14
14 / 140
77 ms20176 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 19; #define int long long int dp[1 << maxn], n; vector<string> s; bool rhyme(const string& a, const string& b) { int u = (int)a.size() - 1, v = (int)b.size() - 1; int cont = 0; while(a[u] == b[v] and u >= 0 and v >= 0) { cont++, u--, v--; } if(cont >= max((int)a.size(), (int)b.size()) - 1) return true; return false; } int solve(int mask) { if(dp[mask] != -1) return dp[mask]; int ff = -1; bool ok = true; for(int i = 0; i < n; i++) { if(mask & (1 << i)) { if(ff == -1) ff = i; else { if(!rhyme(s[i], s[ff])) { ok = false; break; } ff = i; } } } if(!ok) return 0; if(mask == (1 << n) - 1) return n; int ans = __builtin_popcount(mask); for(int i = 0; i < n; i++) { if(mask & (1 << i)) continue; ans = max(ans, solve(mask | (1 << i))); } //string a; // int aux = mask; // while(aux) // { // a += aux % 2 + '0'; // aux /= 2; // } // reverse(a.begin(), a.end()); //cout << a << "\n"; return dp[mask] = ans; } int32_t main() { ios::sync_with_stdio(false), cin.tie(nullptr); cin >> n; for(int i = 0; i < n; i++) { string a; cin >> a; s.push_back(a); } memset(dp, -1, sizeof(dp)); cout << solve(0) << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...