题意:给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\n",res); } } return 0; }
一道题看bitset应用 --ZOJ 3642,布布扣,bubuko.com
原文:http://www.cnblogs.com/whatbeg/p/3897994.html