Unrequited Love [ZOJ 3601]

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;
} 
原文地址:https://www.cnblogs.com/zhang1107/p/3067883.html