2014 Super Training #6 F Search in the Wiki --集合取交+暴力

原题: ZOJ 3674 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3674

题意不难理解,很容易想到用暴力,但是无从下手,不知道怎么实现。后来看了网上的代码,直接用vector和map暴力,用到了set_intersection()函数,之前也听过这个函数,但是一直没写过,于是照着他的代码打了一遍,算是见识一下这个函数了。

代码看一下就能看懂了,关键看自己能不能写出来。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <cstdlib>
using namespace std;
#define N 10007

char name[35],ss[210],tips[210];
int check[110];

int main()
{
    int n,m,i,j,a,b;
    int cword,ctips,ind,ccheck;
    while(scanf("%d",&n)!=EOF)
    {
        cword = ctips = 0;
        map<string,int> word;
        map<string,int> tip;
        map<int,string> atip;
        vector<int> G[110],K1,K2;
        for(j=1;j<=n;j++)
        {
            scanf("%s",name);
            if(!word[name])
                word[name] = ++cword;  //hash
            a = word[name];
            getchar();
            gets(ss);
            ind = 0;
            for(i=0;ss[i];i++)
            {
                if(ss[i] == ' ')
                {
                    tips[ind] = '';
                    if(!tip[tips])
                    {
                        tip[tips] = ++ctips;
                        atip[ctips] = tips;
                    }
                    b = tip[tips];
                    G[a].push_back(b);
                    ind = 0;
                }
                else
                    tips[ind++] = ss[i];
            }
            tips[ind] = 0;
            if(!tip[tips])
            {
                tip[tips] = ++ctips;
                atip[ctips] = tips;
            }
            b = tip[tips];
            G[a].push_back(b);
            sort(G[a].begin(),G[a].end());
        }
        scanf("%d",&m);
        getchar();
        while(m--)
        {
            ccheck = 0;
            gets(ss);
            ind = 0;
            for(i=0;ss[i];i++)
            {
                if(ss[i] == ' ')
                {
                    name[ind] = 0;
                    check[ccheck++] = word[name];
                    ind = 0;
                }
                else
                    name[ind++] = ss[i];
            }
            name[ind] = 0;
            check[ccheck++] = word[name];
            K1.clear();
            vector<int> ::iterator it;
            for(it=G[check[0]].begin();it<G[check[0]].end();it++)
                K1.push_back(*it);
            for(i=1;i<ccheck;i++)
            {
                K2.clear();
                set_intersection(K1.begin(),K1.end(),G[check[i]].begin(),G[check[i]].end(),back_inserter(K2));
                i++;
                if(i >= ccheck)  //last one
                {
                    K1.clear();
                    for(it=K2.begin();it<K2.end();it++)
                        K1.push_back(*it);
                    break;
                }
                K1.clear();
                set_intersection(K2.begin(),K2.end(),G[check[i]].begin(),G[check[i]].end(),back_inserter(K1));
            }
            //最终结果看K1
            if(!K1.size())
            {
                puts("NO");
                continue;
            }
            set<string> ans;
            for(it=K1.begin();it<K1.end();it++)
                ans.insert(atip[*it]);
            set<string>::iterator st;
            st = ans.begin();
            cout<<*st;
            for(st++;st!=ans.end();st++)
                cout<<" "<<*st;
            puts("");
        }
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/whatbeg/p/3830678.html