题目链接

http://codeforces.com/problemset/problem/713/A

题意

三种操作:

+  ai 集合里加一个整数ai,相同数记为多个。

 -  ai 集合里减一个该整数ai,若集合中存在多个则减一个,保证减操作时集合中有该数至少一个。

? s 输出集合中匹配模式s的整数有多少个,s是01串,0表示对应位为偶数,1表示对应位为奇数,若模式和整数位数不同则左侧补0补齐。For example, if the pattern is s = 010, than integers 92, 2212, 50 and 414 match the pattern, while integers 3, 110, 25 and 1030 do not.

此外,整数ai不超过10^18,模式s长度不超过18位。

总操作次数n<=10^6。

思路

原思路:是每次?操作时,遍历集合中的数看是否匹配模式。

结果:在n量级大时超时。

正确思路的点:

首先,整数ai和模式s都可以映射到唯一的数pos上,左侧补0无影响。

其次,ai和s映射到数pos的用相同方法处理。

故把串各位依次取奇1偶0,然后得到的数pos结果只有2^18种,开一个数组存每种结果的出现次数即可,?操作时直接输出数组对应pos的值即可,而不用再遍历当时的集合元素计算有多少个元素匹配该模式,降低时间复杂度。

相关知识点

位操作

代码

#include <stdio.h>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <string>
#include <string.h>
using namespace std; int cnt[1<<19]; int trans(char * str){
int num=0;
for(size_t i=0;i<strlen(str);i++){
int x=str[i]-'0';
num+=x&1;
num=num<<1;
}
return num;
} int main(int argc, const char * argv[]) {
memset(cnt,0,sizeof(cnt));
int n;
scanf("%d",&n);
while(n--){
char op[2];
char str[20];
int num;
scanf("%s%s",op,str);
num=trans(str);
if(op[0]=='+'){cnt[num]++;}
else if(op[0]=='-'){cnt[num]--;}
else{
printf("%d\n",cnt[num]);
}
}
return 0;
}

最新文章

  1. php学习零散笔记—字符串分割、fetch函数和单双引号。
  2. Hibernate学习笔记(二)
  3. 通过源码成功启动odoo 10.0
  4. NPOI 通用导出数据到Excel 分类: C# Helper 2014-11-04 16:06 246人阅读 评论(0) 收藏
  5. 浅谈Java回调机制
  6. python matplotlib 绘图
  7. for循环与for in循环
  8. HTML5外包团队——技术分享:HTML5判断设备在线离线及监听网络状态变化例子
  9. Linux定时任务crontab命令使用详解
  10. PHP上传文件超过了最大文件大小限制导致无法上传成功
  11. 【原】手写一个promise
  12. jquey(判断文本框输入的网址链接是否符合规则)
  13. jQuery入门:认识jQuery
  14. Android开发中小知识
  15. 《RabbitMQ Tutorial》译文 第 6 章 远程过程调用(RPC)
  16. bash shell快捷键[转]
  17. HMM Viterbi算法 详解
  18. 撸一撸Spring Cloud Ribbon的原理
  19. nodejs-2.httpfuwu
  20. 通过配置文件新建solr的core

热门文章

  1. crontab 安装与配置
  2. ThinkPHP子类继承Controller类的注意事项
  3. MyBatis基础-1
  4. thinkphp的PHPexecl表格样式设置
  5. 函数传参传的是啥的思考【java Python】
  6. C#自制Web 服务器开发:mysql免安装版配置步骤详解分享
  7. Maven项目之间的关系
  8. 吴裕雄 07-MySQL数据类型
  9. 指向字符串的指针和char类型的数组
  10. 设置HTML编码为UTF-8