リンク: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
備考:
概念の繰り返し:
チャットの場合は
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 ; }