B1139 First Contact (30分)
这篇是教我追女生要微信的。
//A看上B,A要经过和自己性别一样的C,给性别和B一样的D发短信我A喜欢B
简单讲就是需要一对已成的情侣撮合!
因为A和B都是单身U•ェ•*U,所以不存在别的异性关系,但A与B可能存在同性恋,同性恋也需要同性恋情侣撮合
- 性别相同的建立联系
- 数组不能存放负值,一个编号4位,所以用八位放在map去映射
- 在查找的时候A,B同性恋的情况要排除
- 坑点:直接int输入编号对于+0000和-0000的情况是直接默认为0的,但要分性别的。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <math.h>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
#define lowbit(i)((i)&(-i))
using namespace std;
typedef long long ll;
const int MAX=301;
const int INF=0x3f3f3f3f;
const int MOD=1000000007;
const int SQR=633;
struct node
{
int a,b;
};
bool cmp(node p,node q)
{
if(p.a!=q.a)
return p.a<q.a;
else if(p.b!=q.b)
return p.b<q.b;
}
map<int,bool>mp;
vector<int>vt[10005];
int change(string a)
{
int sum=0;
if(a[0]=='-')
a.erase(a.begin());
for(int i=0;i<a.size();i++)
{
sum=(a[i]-'0')+sum*10;
}
return sum;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
string x,y;
int c,d;
cin>>x>>y;
c=abs(change(x));
d=abs(change(y));
if(x.size()==y.size())
{
vt[c].push_back(d);
vt[d].push_back(c);
}
mp[c*10000+d]=mp[d*10000+c]=true;
}
int k;
scanf("%d",&k);
for(int i=0;i<k;i++)
{
vector<node>res;
int t1,t2;
scanf("%d%d",&t1,&t2);
t1=abs(t1);
t2=abs(t2);
for(int i=0;i<vt[t1].size();i++)
{
for(int j=0;j<vt[t2].size();j++)
{
if(vt[t1][i]==t2||vt[t2][j]==t1)
continue;
if(mp[vt[t1][i]*10000+vt[t2][j]]==true)
res.push_back(node{vt[t1][i],vt[t2][j]});
}
}
sort(res.begin(),res.end(),cmp);
printf("%d\n",res.size());
for(int i=0;i<res.size();i++)
printf("%04d %04d\n",res[i].a,res[i].b);
}
return 0;
}