zoukankan      html  css  js  c++  java
  • 一道题看bitset应用 --ZOJ 3642

    题意:给n个文件,包括文件名和文件大小,然后给出k个关键词,查询包含该关键词的文件的大小总和。文件名为一些中括号括起的关键词的合集。

    解法:可用bitset记录每一个关键词在哪些文件中出现,然后查询即可。

    bitset用法如下:

    bitset<SIZE> bs;
    bool is_set = bs.any();    //是否存在1
    bool not_set = bs.none();  //是否全0
    int cnt_one = bs.count();
    
    bs[index] = 1;
    bs.flip(index);    //反转第index位
    bs[index].flip()   //反转第index位
    bs.flip()          //反转所有
    
    bs.set();          //所有位赋为1
    bs.reset();        //所有位赋为0
    bs.set(index);     //第index位赋为1
    bs.reset(index)    //第index位赋为0
    
    string bitval("1010");
    bitset<32> bs2(bitval);   //初始化

    用到了指针和strchr函数,strchr(str,ch)函数用来找出str指向的字符串中第一次出现字符ch的位置。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <string>
    #include <map>
    #include <bitset>
    #include <cstdlib>
    #define ll long long
    using namespace std;
    #define N 1207
    
    bitset<N> mask;
    ll siz[N];
    char ss[N];
    char *a,*b;
    map<string,bitset<N> > mp;
    
    int main()
    {
        int n,k,i,j;
        while(scanf("%d",&n)!=EOF)
        {
            mp.clear();
            for(i=1;i<=n;i++)
            {
                scanf("%s %lld",ss,&siz[i]);
                a = ss;
                while((a = strchr(a,'[')) != NULL)
                {
                    b = strchr(a,']');
                    string tmp = string(a+1,b);
                    mp[tmp].set(i-1);
                    a = b;
                }
            }
            scanf("%d",&k);
            while(k--)
            {
                scanf("%s",ss);
                for(j=0;j<n;j++)
                    mask.set(j);
                a = ss;
                while((a = strchr(a,'[')) != NULL)
                {
                    b = strchr(a,']');
                    string tmp = string(a+1,b);
                    if(!mp.count(tmp))
                    {
                        mask.reset();
                        break;
                    }
                    else
                        mask &= mp.find(tmp)->second;
                    a = b;
                }
                ll res = 0;
                for(j=0;j<n;j++)
                {
                    if(mask[j])
                        res += siz[j+1];
                }
                printf("%lld
    ",res);
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    大数据技术之Kafka是什么
    大数据技术之Hadoop 基础认识
    在eclipse中运行Mapreduce & spark
    datatstage 中一直处于Ready 状态
    Datastage run 有时候太慢 有时候performance 还Okay
    不能重复造轮子,尤其是枯燥的轮子,要造就造有趣的、好玩的轮子
    什么是好?什么是优秀?
    字面量-上集
    图片切换-vue
    数据绑定
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3897994.html
Copyright © 2011-2022 走看看