本是一道很简单的题目,我做了足足一个星期,后台的数据太不规范了。。。
这题算是一个考思维的题目
贴一下我乱七八糟的代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <map>
using namespace std;
map<string,int>ma;
char s1[50];
char s2[50];
struct num
{
char s1[25];
}b[31000*2];
bool ch1[31000*2];
bool ch2[31000*2];
bool ch3[31000*2];
struct Num
{
int y,next;
}c[2000000],e[2000000];
int d[31000*2],f[31000*2];
int Top3,Top4;
int main()
{
//freopen("data.txt","r",stdin);
void addeage1(int x,int y);
void addeage2(int x,int y);
int t;
scanf("%d",&t);
while(t--)
{
int n,m,q;
scanf("%d %d %d",&n,&m,&q);
ma.clear();
int Top1=0;
Top3=Top4=0;
memset(d,-1,sizeof(d));
memset(f,-1,sizeof(f));
for(int i=1;i<=n;i++)
{
scanf("%s",s1);
if(ma[s1]==0)
{
ma[s1]=++Top1;
}
int k;
scanf("%d",&k);
for(int j=1;j<=k;j++)
{
scanf("%s",s2);
if(ma[s2]==0)
{
ma[s2] = ++Top1;
}
addeage1(ma[s1],ma[s2]);
addeage2(ma[s2],ma[s1]);
}
}
for(int i=1;i<=m;i++)
{
scanf("%s",s1);
if(ma[s1]==0)
{
ma[s1]=++Top1;
}
int k;
scanf("%d",&k);
for(int j=1;j<=k;j++)
{
scanf("%s",s2);
if(ma[s2]==0)
{
ma[s2] = ++Top1;
}
addeage1(ma[s1],ma[s2]);
addeage2(ma[s2],ma[s1]);
}
}
for(int i=1;i<=q;i++)
{
int x1 = 0;
int x2 = 0;
int k;
scanf("%d",&k);
int res1,res2;
memset(ch2,false,sizeof(ch2));
memset(ch1,false,sizeof(ch1));
for(int j=1;j<=k;j++)
{
scanf("%s",b[j].s1);
ch2[ma[b[j].s1]] = true;
ch1[ma[b[j].s1]] = true;
}
if(k==0)
{
printf("0\n");
continue;
}
int res = -1;
for(int j=1;j<=k;j++)
{
int x = ma[b[j].s1];
if(!ch2[x])
{
continue;
}
memset(ch3,false,sizeof(ch3));
for(int u = d[x];u!=-1;u=c[u].next)
{
int y = c[u].y;
if(ch1[y])
{
ch3[y] = true;
ch2[y] = false;
}
}
bool ans = true;
for(int u=1;u<=k;u++)
{
if(u==j)
{
continue;
}
int uv = ma[b[u].s1];
if(!ch3[uv])
{
ans = false;
break;
}
}
if(ans)
{
res = j;
break;
}
}
if(res==-1)
{
printf("0\n");
continue;
}
bool ans = true;
for(int u=f[ma[b[res].s1]];u!=-1;u=e[u].next)
{
int y = e[u].y;
if(ch1[y])
{
ans = false;
break;
}
}
if(ans)
{
printf("1 %s\n",b[res].s1);
}else
{
printf("0\n");
}
}
printf("\n");
}
return 0;
}
void addeage1(int x,int y)
{
c[Top3].y = y;
c[Top3].next = d[x];
d[x] = Top3++;
}
void addeage2(int x,int y)
{
e[Top4].y = y;
e[Top4].next = f[x];
f[x] = Top4++;
}