Codeforces Round #603 (Div. 2) D. Secret Passwords(DFS)
题目链接:https://codeforces.com/contest/1263/problem/D
题意
给出 $n$ 个小写字母串,定义两个字符串是等价的,如果满足以下条件之一:
- 两个字符串有同一个字母
- 两个字符串与第三个字符串等价
问 $n$ 个字符串中有多少组等价字符串。
题解
把每个字符串视为 $size - 1$ 条边的一个图,两个字符串等价即两个图相连通,用 $26$ 个字母作为结点建图然后求连通图的个数即可。
代码
#include <bits/stdc++.h> using namespace std; set<int> e[26]; bool appear[26], vis[26]; void dfs(int u) { vis[u] = true; for (int v : e[u]) if (!vis[v]) dfs(v); } int main() { int n; cin >> n; for (int i = 0; i < n; i++) { string s; cin >> s; for (char c : s) appear[c - 'a'] = true; for (int j = 1; j < s.size(); j++) { int u = s[j - 1] - 'a'; int v = s[j] - 'a'; e[u].insert(v); e[v].insert(u); } } int ans = 0; for (int i = 0; i < 26; i++) if (appear[i] and !vis[i]) dfs(i), ans++; cout << ans << "\n"; }

浙公网安备 33010602011771号