一道题看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
原文地址:https://www.cnblogs.com/whatbeg/p/3897994.html