hiho 1335 Email Merge

来源:互联网 发布:dota之最强血脉知轩 编辑:程序博客网 时间:2024/06/17 06:03
#include<bits/stdc++.h>using namespace std;const int maxn=1e5+5;string s;map<string,int> too;map<int,string> findd;int cnt;bool flag[maxn];vector<int> edge[maxn];vector<int> res[maxn];int main(){    int t,n,i,j;    scanf("%d",&t);    cnt=t;    for(i=1;i<=t;i++)    {        cin>>s;        too[s]=i;        findd[i]=s;        scanf("%d",&n);        while(n--)        {            cin>>s;            if(!too[s])            {                too[s]=++cnt;                findd[cnt]=s;            }            edge[i].push_back(too[s]);            edge[too[s]].push_back(i);        }    }    cnt=0;    for(i=1;i<=t;i++)    {        if(flag[i])            continue;        queue<int> que;        res[++cnt].push_back(i);        que.push(i);        flag[i]=true;        while(que.size())        {            int now=que.front();            que.pop();            for(vector<int>::iterator it=edge[now].begin();it!=edge[now].end();it++)            {                if(flag[*it])                    continue;                que.push(*it);                if(*it<=t)                    res[cnt].push_back(*it);                flag[*it]=true;            }        }        sort(res[cnt].begin(),res[cnt].end());    }    for(i=1;i<=cnt;i++)    {        cout<<findd[*(res[i].begin())];        for(vector<int>::iterator it=res[i].begin()+1;it!=res[i].end();it++)            cout<<' '<<findd[*it];        cout<<endl;    }    return 0;}