質問の意味:
文字列のNは、同じ文字、彼らは同じコレクションに属しているものと同じで任意の二つの文字列の場合、いくつかのコレクションの合計を求めて
アイデア:
各文字列の互いに素セット、合併の最初の文字と各文字、彼らは同じコレクション(CHとして、各文字列を意味する[0]、いくつかの異なるを見て)に間違いなくあるので、合併後、思考タイトル(互いに素なセット表題裸)のようになり、根の中の数、セット、すなわち、数(1-26)のために
コード:
書式#include <iostreamの> 書式#include <stdio.hに> する#include <アルゴリズム> 書式#include < 文字列の.h> の#include <ベクトル> 書式#include <math.h>の 書式#include <マップ> 書式#include <キュー> 書式#include < セット > 使用して 名前空間はstdを、 int型のプレ[ 100 ]。 int型 VIS [ 100050 ]。 int型の検索(INT X) { 場合(X ==事前[X])リターンX。 他の リターン前[X] =(予備[X])を見つけます。 } ボイドは、(参加int型のx、int型のy)を { INT FX =(X)を見つけるFY = (y)を見つけます。 もし(FX> 年度)スワップ(FX、FY)。 もし(FX = FY!)前[FX] = FY; } int型のmain() { // freopenは( "in.txt"、 "R"、標準入力)。 int型のn; チャー CH [ 100050 ]。 以下のために(INT iが= 1 ; I <= 26 ; ++ i)は事前に[I] = I。 scanf関数(" %のD "、&N) ために(INTは iは= 1 ; I <= N; I ++ ) { scanf関数(" %S " 、CH)。 INT LEN = STRLEN(CH)。 INT、T =見つける(CH [ 0 ] - ' ' + 1 )。 VIS [T] = 1 。 以下のために(INT iが= 1 ; I <LEN; I ++ ) { int型 TT = CH [I] - ' ' + 1 。 VIS [TT] = 1 。 (T、TT)参加; // CH [0]マージと } } int型 ANS = 0 ; のために(INT I = 1 ; I <= 26であり ; I ++ ) IF(PRE [I] == I && VIS [I] == 1)// 文字を決定前提が登場 ANS ++ ; のprintf(" %D \ N- " 、ANS); // のprintf( "こんにちは、世界\ N-"); }