D. Secret Passwords(字符串並查集)

 

如果兩字符串有相同的字母,那麼他們相等;

如果這兩個字符串和第三個字符串相等 ,那麼這兩個字符串也相等


    int n,m,t;
    int i,j,k;
    bool vis[30];
    int fa[30];
int Find(int son){ return fa[son]==son ? fa[son] : fa[son]=Find(fa[son]) ; }
void Union(int x,int y){
    x = Find(x); y = Find(y);
    if( x != y ) fa[y] = x;   
    //if( Find(x) != Find(y) ) fa[y] = x;   一開始只寫這句,莫名其妙就 WRONG 了
}

int main()
{
    IOS;
    while( cin>>n ){
        for( i=1 ; i<=30 ; i++ ) fa[i]=i;
        for( k=1 ; k<=n ; k++ ){
            string s; cin >> s;
            int len=s.size();
            for( i=0 ; i<len-1 ; i++ ){ //將一個單詞的所有字母連接起來
                vis[ s[i] - 'a' + 1 ] = 1;
                int x = s[i] - 'a' + 1;
                int y = s[i+1] - 'a' + 1;
                Union(x,y);
            }
            vis[ s[len-1] -'a' + 1 ] = 1;
        }
        int ans=0;
        for(i=1;i<=26;i++) if( fa[i]==i && vis[i] ) ans++;
        cout<<ans<<endl;
    }
    return 0 ;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章