Codeforcesラウンド#603(本部2)D.シークレットパスワード互いに素セット

D.シークレットパスワード

一つの未知のハッカーは、次のコンテストの問題を取得するには、システムのテストAtForcesの管理者のパスワードを取得したいです。それを達成するために、彼は管理者のオフィスに潜入し、n個のパスワードのリストを一枚の紙を盗んだ - 文字列、小さなラテン文字で構成されています。

ハッカーは家に行き、AtForcesをハックする準備を始めました。彼は、システムがパスワードだけ盗まれたリストから、システムはaとbは次のようにパスワードの等価性を決定することを含んでいることがわかりました。

AとBの両方に存在する文字がある場合、2つのパスワードおよびBは同等です。
AとBの両方に相当し、リストからパスワードcが存在する場合に2つのパスワードとBは同等です。
パスワードがシステムに設定されていると等価一方がシステムにアクセスするために適用されている場合、ユーザがシステムにアクセスされます。

例えば、リストは、パスワードその後、「」、「B」、「AB」、「D」、パスワード「」、「B」、「AB」が互いに同等であるが、パスワード「d」があるが含まれている場合リストから他のパスワードと同じではありません。換言すれば、:

管理者のパスワードは「B」である場合、あなたは、このパスワードのいずれかの使用してシステムにアクセスすることができます:「」、「b」を、「AB」。
管理者のパスワードは、あなただけの「d」を使用してシステムにアクセスすることができ、「D」です。
リストからわずか1つのパスワードは、テスト・システムから管理者のパスワードです。ヘルプハッカーがシステムへの保証のアクセスに必要なパスワードの最小数を計算します。ハッカーがシステムに設定されたパスワードを知っていないことに注意してください。

入力

リスト内のパスワードの数 - 最初の行は、整数N(1≤n≤2⋅105)を含みます。非空の文字列SI、最大50文字の長さと - 次のn行は、リストからパスワードが含まれています。パスワードの一部が同じであってもよいです。

すべてのパスワードの長さの合計が106文字を超えていないことが保証されています。それらのすべては小文字のみラテン文字で構成されています。

出力

単一の行では、パスワードの最小数は、システムにアクセスすることを保証することができますそれらの使用を印刷します。

入力
4 、B 、ABのDの出力2 入力3 AB 、BC 、ABCの出力1 入力1 codeforcesの出力1

















注意

システムにアクセスするためのパスワードのいずれかを使用する第二の例のハッカーを必要としています。

問題の意味

今、あなたはn個のパスワードを持っていますが、いくつかのパスワードが同等であり、同等の定義は次のとおりです。

文字列中のaとbが登場している、文字列と文字列は同等bは、文字xがあると。

次に、文字列と文字列の等価C、BおよびCは、文字列と同等であると仮定し、Bも同等です。

パスワードの最小数をマスター、あなたはすべてのパスワードを持つことができます確認して下さい

問題の解決策

問題の動画を解決https://www.bilibili.com/video/av77514280/

互いに素セット裸のタイトル。すべての文字と調理でき、独自の合成が含まれています

コード

#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5+7;
int fa[maxn],n;
string s[maxn];
int fi(int x){
    return fa[x]==x?fa[x]:fa[x]=fi(fa[x]);
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>s[i];
    }
    for(int j=1;j<=n+26;j++){
        fa[j]=j;
    }
    for(int i=1;i<=n;i++){
        for(int j=0;j<s[i].size();j++){
            fa[fi(i)]=fa[fi(n+s[i][j]-'a'+1)];
        }
    }
    int ans = 0;
    set<int>vis;
    for(int i=1;i<=n;i++){
        if(!vis.count(fi(i))){
            ans++;
            vis.insert(fi(i));
        }
    }
    cout<<ans<<endl;
}

おすすめ

転載: www.cnblogs.com/qscqesze/p/11961835.html