• 4604. 集合询问


    4604. 集合询问 - AcWing题库

    有一个整数集合,初始时集合为空。

    现在,要对该集合进行 t 次操作,操作分为以下三种:

    • + x,将一个非负整数 x 添加至集合中。注意,集合中可以存在多个相同的整数。
    • - x,从集合中删除一个非负整数 x。可以保证执行此操作时,集合中至少存在一个 x。
    • ? s,询问操作,给定一个由 0 和 1 组成的模板 s,请你计算并输出此时集合中有多少个元素可以与 s 相匹配。

    关于判断整数 x 与模板 s 是否匹配的具体方法如下:

    • 首先,在进行匹配判断前,应保证 x 与 s 位数相同,如果两者位数不同,则位数更少的一方需补充前导 0 至与位数更多的一方位数相同为止。
    • 从最高位开始,对每一位进行逐个判断,如果 s 的第 i 位为 0,则 x 的第 i 位必须为偶数,如果 s 的第ii 位为 1,则 x 的第 i 位必须为奇数。
    • 如果有任意一位不满足上述条件,则视为 x 与 s 不匹配。如果所有位均满足上述条件,则视为 x 与 s 匹配。

    输入格式

    第一行包含整数 t,表示操作次数。

    接下来 t 行,每行包含一个操作,格式如题面描述。

    保证至少存在一个查询操作。

    输入样例1:

    1. 12
    2. + 1
    3. + 241
    4. ? 1
    5. + 361
    6. - 241
    7. ? 0101
    8. + 101
    9. ? 101
    10. - 101
    11. ? 101
    12. + 4000
    13. ? 0

    输出样例1:

    1. 2
    2. 1
    3. 2
    4. 1
    5. 1

    输入样例2:

    1. 5
    2. + 200
    3. + 200
    4. ? 0
    5. - 200
    6. ? 0

    输出样例2:

    1. 2
    2. 1

     

    1. #include
    2. #define LL long long
    3. using namespace std;
    4. const int maxn = 1e6 + 10;
    5. const int mod = 1e9 + 7;
    6. const int INF = 1e9 + 10;
    7. const int N = 1 << 18;
    8. int n;
    9. int cnt[N];
    10. int main(){
    11. cin >> n;
    12. char op[2],str[20];
    13. while(n--){
    14. scanf("%s%s",op,str);
    15. int x = 0;
    16. for(int i = 0;str[i];i++){
    17. x = x * 2 + str[i] % 2;
    18. }
    19. if(*op == '+') cnt[x] ++;
    20. else if(*op == '-') cnt[x]--;
    21. else cout << cnt[x] << endl;
    22. }
    23. return 0;
    24. }

  • 相关阅读:
    显示屏分辨率计算
    [科普文] Web3 中的资产负债表
    [题]跳房子 #单调队列优化(伪)
    20道常见的kafka面试题以及答案
    信息系统项目管理师 第四版 第17章 项目干系人管理
    接口--抽象方法
    dedecms织梦管理系统模板标签代码
    商城项目 pc----商品详情页
    机器学习-逻辑回归
    修改一个MD5的VB源码,使用它支持UTF8编码
  • 原文地址:https://blog.csdn.net/Recursions/article/details/126604405