图问题,考察的知识点有,字符串hash,vector中结构体数组的排序。
坑点如下
1,如果用int读入数据,则对-0000的数据无法判断性别,故用string储存。
2,注意输出格式为04d%
3,暗恋的人性别相同时找同性朋友时要避免找到暗恋的人。
4,本题只用找同性朋友,因此用vector容器储存同性朋友。
整体代码如下
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
bool fri[310][310];
unordered_map<string,int>toC;
unordered_map<int,string>toI;
vector<int>f[310];
int num=0;
struct Node{
int fir,sec;
Node(int a,int b){
fir=a;
sec=b;
}
};
bool cmp( Node a, Node b)
{ return a.fir!=b.fir? a.fir<b.fir:a.sec<b.sec;
}
int give(string n){
if(toC.find(n)==toC.end())
{
toC[n]=num;
toI[num]=n;
return num++;
}
else return toC[n];
}
void find(string v1,string v2){
int num=0;
vector<Node>ans;
for(int i=0;i<f[give(v1)].size();i++)
{ for(int l=0;l<f[give(v2)].size();l++)
{if(fri[f[give(v1)][i]][f[give(v2)][l]])
{int a,b;
if(v1.size()==v2.size()&&(f[give(v1)][i]==give(v2)||f[give(v2)][l]==give(v1)))continue;
a=abs(stoi(toI[f[give(v1)][i]]));
b=abs(stoi(toI[f[give(v2)][l]]));
ans.push_back(Node(a,b));
num++;
}
}
}
sort(ans.begin(),ans.end(),cmp);
printf("%d\n",num);
for(int i=0;i<num;i++)
printf("%04d %04d\n",ans[i].fir,ans[i].sec);
return;
}
int main(){
string v1,v2;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
cin>>v1>>v2;
fri[give(v1)][give(v2)]=fri[give(v2)][give(v1)]=true;
if(v1.size()==v2.size()){
f[give(v1)].push_back(give(v2));
f[give(v2)].push_back(give(v1));
}
}
scanf("%d",&k);
for(int i=0;i<k;i++){
cin>>v1>>v2;
find(v1,v2);
}
return 0;
}