- 测试点2:输入存在“-0000”
- 测试点3、4、5:AB ≠ CD
#include<bits/stdc++.h>
using namespace std;
int N, M, K;
string v1, v2;
vector<int> gender;
vector<vector<int>> v;
map<string, int> m1;
map<int, string> m2;
void findPath(vector<vector<int>> &path){
int a = m1[v1], b = m1[v2], c, d;
for(int i = 0; i < v[a].size(); i++){
c = v[a][i];
if(c == b) continue;
if(gender[a] == gender[c]){
for(int k = 0; k < v[c].size(); k++){
d = v[c][k];
if(d == a) continue;
if(gender[b] == gender[d] && find(v[d].begin(), v[d].end(), b) != v[d].end())
path.push_back({c, d});
}
}
}
}
bool cmp(vector<int> a, vector<int> b){
if(a[0] == b[0]) return m2[a[1]] < m2[b[1]];
return m2[a[0]] < m2[b[0]];
}
int main(void){
scanf("%d %d", &N, &M);
v.resize(N); gender.resize(N);
int n = 0;
for(int i = 0; i < M; i++){
cin >> v1 >> v2;
int tag1 = 1, tag2 = 1;
if(v1.size() == 5) tag1 = 0, v1 = v1.substr(1, 4);
if(v2.size() == 5) tag2 = 0, v2 = v2.substr(1, 4);
if(m1.find(v1) == m1.end()) m1[v1] = n, m2[n] = v1, n++;
if(m1.find(v2) == m1.end()) m1[v2] = n, m2[n] = v2, n++;
v[m1[v1]].push_back(m1[v2]); v[m1[v2]].push_back(m1[v1]);
gender[m1[v1]] = tag1; gender[m1[v2]] = tag2;
}
scanf("%d", &K);
for(int i = 0; i < K; i++){
cin >> v1 >> v2;
if(v1.size() == 5) v1 = v1.substr(1, 4);
if(v2.size() == 5) v2 = v2.substr(1, 4);
if(m1.find(v1) == m1.end() || m1.find(v2) == m1.end())
printf("0\n");
else{
vector<vector<int>> path;
findPath(path);
sort(path.begin(), path.end(), cmp);
printf("%d\n", path.size());
for(int j = 0; j < path.size(); j++)
printf("%s %s\n", m2[path[j][0]].c_str(), m2[path[j][1]].c_str());
}
}
return 0;
}