Submission #100191

#TimeUsernameProblemLanguageResultExecution timeMemory
100191pamajRima (COCI17_rima)C++14
42 / 140
255 ms188076 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxn = 19;

#define int long long

int dp[1 << maxn][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, int last)
{
	if(dp[mask][last] != -1) return dp[mask][last];

	
	int ans = __builtin_popcount(mask);
	for(int i = 0; i < n; i++)
	{
		if(mask & (1 << i)) continue;

		if(rhyme(s[i], s[last]))
		{
			ans = max(ans, solve(mask | (1 << i), 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][last] = 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));

	int ans = 0;

	for(int i = 0; i < n; i++)
	{
		ans = max(ans, solve(0, i));
	}

	cout << ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...