P2814 家谱
菜鸟生成记(45)
思路:并查集+map<string,string>
如果把这些字符串改为数字,这一题的就非常简单,就成了一个并查集模板题了;这一题难就难在map这个数据结构的理解和使用;
抓耳挠腮近一个小时完全没思路,就只知道要用并查集;同学的一个map思路点醒了我;爽!今晚可以睡个好觉了;
#include<iostream>
#include<string>
#include<map>
#include<vector>
#define son string
#define fat string
using namespace std;
map<son,fat>m;
map<son,fat>::iterator it;
vector<string> str1,str2,str;
void find1(string s)
{
string t=s,s1;
while(t!="")
{
if(m[t]!="")
s1=m[t];
t=m[t];
}
m[s]=s1;
}
int main()
{
string x,t;
while(cin>>x&&x!="$")
{
if(x[0]=='?')
{
str2.push_back(x);
}
else
{
t=x;
t.erase(0,1);
m.insert(make_pair(t,""));
str1.push_back(x);
}
x.clear();
}
for(int i=0;i<str1.size();i++)
{
if(str1[i][0]=='#')
{
string f=str1[i],t;
f.erase(0,1);
for(int j=i+1;j<str1.size();j++)
{
if(str1[j][0]=='#')
break;
t=str1[j];
t.erase(0,1);
m[t]=f;
}
}
}
for(it=m.begin();it!=m.end();it++)
{
find1(it->first);
}
for(int i=0;i<str2.size();i++)
{
string t=str2[i].erase(0,1);
if(m[t]!="")
cout<<t<<" "<<m[t]<<endl;
else
cout<<t<<" "<<t<<endl;
}
return 0;
}