洛谷2814
极度细(毒)节(瘤)的字符串处理,以及最后一步弄错。。。。。(水了70分?)
【代码~】
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e4+10;
map<string,int> name;
map<int,string> id;
map<string,bool> a;
string s,s1;
int fa[MAXN],k;
int find(int x)
{
if(x==fa[x])
return x;
return fa[x]=find(fa[x]);
}
int main()
{
for(int i=1;i<=MAXN;++i)
fa[i]=i;
int idx=0,last;
bool flag=false;
while(cin>>s)
{
if(s=="$")
break;
if(s[0]=='#')
{
int len=s.length();
s1=s.substr(1,len-1);
if(!a[s1])
{
idx++;
name[s1]=idx;
a[s1]=true;
id[idx]=s1;
last=idx;
}
else
last=name[s1];
}
if(s[0]=='+')
{
int len=s.length();
s1=s.substr(1,len-1);
if(!a[s1])
{
idx++;
name[s1]=idx;
a[s1]=true;
id[idx]=s1;
int f1=find(idx),f2=find(last);
fa[f1]=f2;
}
else
{
int f1=find(name[s1]),f2=find(last);
fa[f1]=f2;
}
}
if(s[0]=='?')
{
int len=s.length();
s1=s.substr(1,len-1);
cout<<s1;
cout<<" ";
cout<<id[find(name[s1])]<<endl;
}
}
}