D. Secret Passwords

题意:给定n个字符串s,如果两个字符串有任意的相同的字符,那么字符串是equivalent的,并且如果有ab, bc, cd。那么cd和ab也是equivalent的。现在要破解n个字符串的密码,并且n个字符串中只有一个是正确的密码,问最少要试多少次,可以找到正确的密码(不一定完全找到s,equivalent就是ok的)?

思路:暴力破解,26次。问题转化为,多少次查询,可以找到不同的equivalent的数量。并查集,遍历所有字符,然后进行单个字符串内的字符合并,并记录哪些字符出现过。然后,求出集合的数量即可,注意求数量的时候不能直接用dsu的接口,必须得是字符串里出现过的字符所在的集合的数量。

总结:一开始没理解题意,equivalent的传递性...想到的思路是, 所有字符串中选中多少个,可以代表所有的可能性,暴力破解的时间复杂度是2的n次方..
如果改变描述为,至少需要多少个字符串可以涵盖所有的密码..而且没有传递性,那暴力破解的思路就是2选1然后递归判定,最后在包含了所有字符的情况下选一个使用字符串最少的逻辑。
所以还是读题最重要

inline void solve() {
	int n;
	cin >> n;

	Dsu dsu(26);
	vector<bool> occ(26, false);
	for (int i = 0; i < n; ++i) {
		string s;
		cin >> s;
		char pre = s[0] - ' a';
		for (const auto& c : s) {
			occ[c - 'a'] = true;
			dsu.unionSet(c - 'a', pre);
			pre = c - 'a';
		}
	}

	set<int> sett;
	for (int i = 0; i < 26; ++i) {
		if (occ[i]) {
			sett.insert(dsu.findSet(i));
		}
	}

	cout << sett.size() << '\n';
}
posted @ 2025-10-23 10:05  _Yxc  阅读(8)  评论(0)    收藏  举报