http://acm.zju.edu.cn/onlinejudge/showSubmission.do?submissionId=3568082
View Code
//确定king只有一个后可以在O(N)解决每次询问 const int MM = 331630; const int maxn = 31; typedef long long int64; #define debug puts("wrong"); int N,M,Q; char ss[MM][100]; set<pair<int,int> >sbt; map<string,int>mp; map<string,int>::iterator it; char str[100]; int cnt,p[MM]; int find(string tmp) { it=mp.find(tmp); if(it!=mp.end()) return it->second; //比mp[tmp]快 else return mp[tmp]=cnt++; } void get_data() { int i,j,k,c,t1,t2; scanf("%d%d%d",&N,&M,&Q); cnt=1; mp.clear(); sbt.clear(); for(i=0;i<N;i++) { scanf("%s%d",str,&c); t1=find(str); for(j=0;j<c;j++) { scanf("%s",str); t2=find(str); sbt.insert(make_pair(t1,t2)); } } for(i=0;i<M;i++) { scanf("%s%d",str,&c); t1=find(str); for(j=0;j<c;j++) { scanf("%s",str); t2=find(str); sbt.insert(make_pair(t1,t2)); } } } void solve() { int i,j,k,c,tmp; while(Q--) { scanf("%d",&c); for(i=0;i<c;i++) { scanf("%s",ss[i]); p[i]=find(ss[i]); } for(tmp=0,i=1;i<c;i++) { if(sbt.find(make_pair(p[i],p[tmp]))!=sbt.end() || sbt.find(make_pair(p[tmp],p[i]))==sbt.end()) tmp=i; } for(i=0;i<c;i++) { if(tmp==i) continue; if(sbt.find(make_pair(p[i],p[tmp]))!=sbt.end() || sbt.find(make_pair(p[tmp],p[i]))==sbt.end()) break; } if(i<c) { puts("0"); } else { printf("1"); printf(" %s\n",ss[tmp]); } } printf("\n"); } int main() { int ca; scanf("%d",&ca); while(ca--) get_data(),solve(); return 0; }