time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Today Sonya learned about long integers and invited all her friends to share the fun. Sonya has an initially empty multiset with integers. Friends give her t queries,
each of one of the following type:

  1.  +  ai —
    add non-negative integer ai to
    the multiset. Note, that she has a multiset, thus there may be many occurrences of the same integer.
  2.  -  ai —
    delete a single occurrence of non-negative integer ai from
    the multiset. It's guaranteed, that there is at least one ai in
    the multiset.
  3. s — count the
    number of integers in the multiset (with repetitions) that match some pattern s consisting of 0 and 1.
    In the pattern,0 stands for the even digits, while 1 stands
    for the odd. Integer x matches the pattern s,
    if the parity of the i-th from the right digit in decimal notation matches the i-th
    from the right digit of the pattern. If the pattern is shorter than this integer, it's supplemented with0-s from the left. Similarly, if the
    integer is shorter than the pattern its decimal notation is supplemented with the 0-s from the left.

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.

Input

The first line of the input contains an integer t (1 ≤ t ≤ 100 000) —
the number of operation Sonya has to perform.

Next t lines provide the descriptions of the queries in order they appear in the input file. The i-th
row starts with a character ci —
the type of the corresponding operation. If ci is
equal to '+' or '-' then it's followed by a space and
an integer ai (0 ≤ ai < 1018)
given without leading zeroes (unless it's 0). If ci equals
'?' then it's followed by a space and a sequence of zeroes and onse, giving the pattern of length no more than 18.

It's guaranteed that there will be at least one query of type '?'.

It's guaranteed that any time some integer is removed from the multiset, there will be at least one occurrence of this integer in it.

Output

For each query of the third type print the number of integers matching the given pattern. Each integer is counted as many times, as it appears in the multiset at this moment of time.

Examples
input
12
+ 1
+ 241
? 1
+ 361
- 241
? 0101
+ 101
? 101
- 101
? 101
+ 4000
? 0
output
2
1
2
1
1
input
4
+ 200
+ 200
- 200
? 0
output
1
Note

Consider the integers matching the patterns from the queries of the third type. Queries are numbered in the order they appear in the input.

  1. 1 and 241.
  2. 361.
  3. 101 and 361.
  4. 361.
  5. 4000.

【题解】

给你一个01串。从右到左对应了每个位置上的要求:0该位置为偶数。1该位置为奇数.

如果01串和要判断的数字不一样。谁短谁前面就补0;

我们不管谁短。直接在输入的数字前面补0至18位就好。

然后用字典树来操作。

插入数字的时候。不要具体记录这个数字是什么(没用!),只要知道这个数字是奇数还是偶数就行了嘛。所以93432你就记录11010.

不要被惯性思维影响!

直接记录数字会T!

然后字典树的域要记录以这个节点为终点的数字个数。

每次到这个节点累加这个就可以了。

【代码】

#include <cstdio>
#include <cstring> using namespace std; const int MAX_SIZE = 2000000; int t;
int tree[MAX_SIZE][2] = { 0 },totn = 0,ans = 0;
int e[MAX_SIZE] = { 0 }, stop[MAX_SIZE] = { 0 };
char op[5], dig[30]; void insert()
{
int temp = 0;
int len = 18;
for (int i = len-1; i >=0; i--)
{
int d = dig[i] - '0';
d = d % 2;//直接记录是奇数还是偶数就可以了。
if (tree[temp][d] == 0)
tree[temp][d] = ++totn;
temp = tree[temp][d];
stop[temp]++;
}
e[temp]++;
} void de_lete()
{
int temp = 0;
int len = 18;
for (int i = len-1; i >=0; i--)
{
int d = dig[i] - '0';
d = d % 2;
temp = tree[temp][d];
stop[temp]--;
}
e[temp]--;
} void dfs(int rt, int len) //用dfs来累加答案。
{
ans += e[rt];
if (len < 0)
return;
int d = dig[len] - '0';
if (tree[rt][d])
dfs(tree[rt][d], len - 1); } void get_ans()
{
int temp = 0;
int len = 18;
dfs(temp, len - 1);
} void input_data()
{
scanf("%d", &t);
char s1[30];
for (int i = 1; i <= t; i++)
{
scanf("%s%s", op, s1);
int len = strlen(s1);
for (int i = 0; i <= 18 - len - 1; i++)//补零
dig[i] = '0';
dig[18 - len] = '\0';
strcat(dig, s1);//最后dig记录的是补0后的字符
if (op[0] == '+')
insert();
else
if (op[0] == '-')
de_lete();
else
{
ans = 0;
get_ans();
printf("%d\n", ans);
}
}
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
input_data();
return 0;
}

【39.68%】【CF 714 C】Filya and Homework的更多相关文章

  1. [原]Water Water Search Problems&#39; Set~Orz【updating...】

    [HDU] [POJ] 作者:u011652573 发表于2014-4-30 10:39:04 原文链接 阅读:30 评论:0 查看评论

  2. jQuery 中的 39 个技巧【申明:来源于网络】

    jQuery 中的 39 个技巧[申明:来源于网络] 地址:http://blog.csdn.net/zhongqi2513/article/details/53704812?ref=myread

  3. 【codeforces】【比赛题解】#851 CF Round #432 (Div.2)

    cf真的难…… 点我浏览丧题. [A]Arpa和她对墨西哥人浪的研究 Arpa正在对墨西哥人浪进行研究. 有n个人站成一排,从1到n编号,他们从时刻0开始墨西哥人浪. 在时刻1,第一个人站起来.在时刻 ...

  4. 剑指Offer:数组中出现次数超过一半的数字【39】

    剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这 ...

  5. poj 2411 Mondriaan&#39;s Dream 【dp】

    题目:id=2411" target="_blank">poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然 ...

  6. 【LeetCode-面试算法经典-Java实现】【118-Pascal&#39;s Triangle(帕斯卡三角形)】

    [118-Pascal's Triangle(帕斯卡三角形(杨辉三角))] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given numRows, generate ...

  7. HDU1164_Eddy&#39;s research I【Miller Rabin素数测试】【Pollar Rho整数分解】

    Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  8. 【OCP、OCM、高可用等】小麦苗课堂网络班招生简章(从入门到专家)--课程大纲

    [OCP.OCM.高可用等]小麦苗课堂网络班招生简章(从入门到专家)--课程大纲 小麦苗信息 我的个人信息 网名:小麦苗 QQ:646634621 QQ群:618766405 我的博客:http:// ...

  9. 每日构建【Daily Build Using CruiseControl.NET and MSBuild】(转载)

    在上一篇项目 管理实践教程二.源代码控制[Source Control Using VisualSVN Server and TortoiseSVN]中 我们已经讲解了如何使用TortoiseSVN和 ...

随机推荐

  1. Hibernate→ 《Hibernate程序开发》教材大纲

    Hibernate ORM 概览 Hibernate 简介 Hibernate 架构 Hibernate 环境 Hibernate 配置 Hibernate 会话 Hibernate 持久化类 Hib ...

  2. java通过实体类组装报文

    条件: 1.实体类字段名 首字母小写(java规范),再通过报文的需求,填充的时候做对应修改即可(正常报文首字母是大写的)! 2.假如xml标签首字母是小写,那么实体类就给大写,首字母是大写,那么实体 ...

  3. js多图上传展示和删除

    html部分 <button class="btn btn-info" for="file">请选择文件</button> <in ...

  4. poj 3280【区间dp】

    poj 3280 题意:给定一个字符串和每个字符删去和增加的代价,求使字符串变成回文串操作所需的最小代价. 题解:哇!开心!终于亲自做对了!做完这两题这个就回了.uva10739  uva 10453 ...

  5. 13条必知必会&&测试

    1.13条必知必会 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> get(**kwargs) ...

  6. Uva 10446【递推,dp】

    UVa 10446 求(n,bcak)递归次数.自己推出来了一个式子: 其实就是这个式子,但是不知道该怎么写,怕递归写法超时.其实直接递推就好,边界条件易得C(0,back)=1.C(1,back)= ...

  7. Java练习 SDUT-1253_进制转换

    进制转换 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入一个十进制数N,将它转换成R进制数输出. Input 输入 ...

  8. java基础-内存分配

    1.java运行时的数据区:程序计数器.方法区.虚拟机栈.本地方法栈.堆 ①.程序计数器:一块较小的内存空间,可看作当前线程所执行的字节码的行号指示器 ②.java虚拟机栈:与程序计数器一样,也是线程 ...

  9. @bzoj - 2388@ 旅行规划

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你维护一个序列,支持两种操作: (1)某个区间 [x, y] ...

  10. 【hiho一下 第147周】小Hi的烦恼

    [题目链接]:http://hihocoder.com/contest/hiho147/problem/1 [题意] [题解] bitset的应用; 设better[j][i]表示第j个科目排名为1. ...