Codeforces Round #603 (Div. 2) D. Secret Passwords(DFS)

题目链接:https://codeforces.com/contest/1263/problem/D

题意

给出 $n$ 个小写字母串,定义两个字符串是等价的,如果满足以下条件之一:

  1. 两个字符串有同一个字母
  2. 两个字符串与第三个字符串等价

问 $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";
}

 

posted @ 2020-06-30 23:40  Kanoon  阅读(171)  评论(0)    收藏  举报