zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    BZOJ2752: [HAOI2012]高速公路(road)
    BZOJ1146: [CTSC2008]网络管理Network
    BZOJ3545: [ONTAK2010]Peaks
    启发式算法
    特征选择算法
    傅里叶变换 小波变换
    流类库 输入输出
    模板与异常处理
    多态性
    派生类与继承
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3830678.html
Copyright © 2011-2022 走看看