南華大学リピータ(互いに素セット)

リンク:https://ac.nowcoder.com/acm/contest/699/B?&headNav=acm&headNav=acm
出典:牛オフネットワーク

タイトル説明

        退屈なグループがあり、グループのすべてのメンバーは、彼らは必死に他の人のメッセージを繰り返し、中国の大学では、ビデオのマシンがあります。しかし、ビデオマシンがニュースによると、グループ内のキャンプ、同キャンプのメンバーの気持ちを繰り返すかどうかを選択するためにキャンプリピート機会もされていたが、確かに他のキャンプのニュースを繰り返しません。

        グループ内のn個の個体(参照番号1-N)があります。今チャットグループm個のメッセージの総数。メンバーならば、これらのメッセージによるとしてください、裁判官は、私はグループ内の番号(1 <= iの= <Nで)非常に興味深いニュースを作った、同じキャンプのメンバーは、このメッセージのケースを繰り返して行くには、そのメッセージは次のようになります数回繰り返しますか?

あなたがメンバーとメンバーのi j個の数を判別できない場合は同じキャンプで、彼らは別のキャンプを考えられています。

説明を入力します。

入力は、M + 1行を含みます。最初の行は、2つのnの整数、mは含み、現在のチャットのその後の動作をM、番号を含む各列iと文字列s(iは送信されたメッセージを表します)。(保証1 <= iが<= N、M <= 100000、メッセージ文字列の長さの合計10万以下です)

出力説明:

n桁を備え、出力ライン、。数は、i番目の反復のi番目のメンバーが複数回(1 <= iが= Nを<)面白いメッセージであることを示します。数字と数字の間のスペースで区切られています。
例1

エントリー

コピー
3 5 
1 
2 
1、B 
2、C 
3、C

輸出

コピー
2 2 2

説明

サンプル1の場合:、チャットの最初の2行から同じネットワーク2と1を導出することができる、3番及び第2番から入手可能な最後の2行は同じキャンプされ、それらの三つの同じキャンプになるように、それらは3つ送ります繰り返しメッセージが2倍となるので、出力は222です。
例2

エントリー

コピー
3 3 
1 
2 B 
3 C

輸出

コピー
0 0 0

説明

サンプル2:1,2,3-別個のキャンプとして、同じキャンプかどうかを決定することができません。

備考:

概念の繰り返し:

チャットの場合は

1 A

2 A

3

メッセージ番号の2,3反復の一部。

チャットである場合

1

2 B

3 Aは

、任意の繰り返し、3の「A」と「」は自分の元のメッセージを構成しません。

アイデア:繰り返しの円の中に,,他のメンバーは、インナーサークルのメンバーのコンテンツを繰り返すことになりますので、我々は互いに素セットは、サークル内の人とリンクされます使用して、どのように多くの個人サークル内を数えます、(サークルと同じ祖先)、人サークルのレコード番号は、配列のみを開くようにして、友達になれる祖先に記録されている必要があります!
#include <iostreamの> 
する#include < ストリング > 
の#include <ベクトル> 
の#include <cstdioを> 
する#include <地図>
 使用して 名前空間STD;
 のconst  int型 N = 100000 + 7。 INT プレ[N];
 int型SUM [N];
 int型検索(INT X){ // パス圧縮プレ後[i]は= jのjはiがルートノードである
    int型 R&LT = X;
     ながら(R&LT =!事前[R&LT]){ 
        R&LT = プレ[R&LT]; 
    } 
    int型 = K X、J、
     一方(!K = R){ 
        J = 事前[K]。
        プレ[K] = R。
        K = J; 
    } 
    戻りR。
} 
ボイドは、(参加INT X、int型のY){
     int型(X)、FY =見つける= FXを検索(y)を、
    もし(!FX = FY){ 
        プレ[FY] = FX。
    } 
} 
int型のmain()
{ 
    IOS :: sync_with_stdio()。
    INTのN、M。
    CIN >> N >> M。
    以下のためのint型i = 1 ; iは= <N; iは、++は
        あらかじめ[I] = I。
    int型×1、X;
    Y1、Y。
    以下のためにint型私= 1 ; I <= M; iは++ ){
         場合(I == 1 
            CIN >> X1 >> Y1。
        { 
            CIN >> X >> Y。
            場合(Yの==のY1){ 
                (X 1、X)に参加。
            } 
            X1 = X、Y1 = Y。
        } 
    } 
    のためにint型のI =。1 ; I <= N; I ++は){ 
        SUM [検索(I)] ++ ;記録//データ
    } 
    のためのINT I = 1 ; I <= N; I ++は){ 
        のprintf(" %のD "、SUM [検索(I)] - 1。); //その減算を覚えておいてください
    } 
    の戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/Accepting/p/11311024.html