一道题看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的位置。
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }
作者:whatbeg
出处1:http://whatbeg.com/
出处2:http://www.cnblogs.com/whatbeg/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多精彩文章抢先看?详见我的独立博客: whatbeg.com