Codeforces cf 713A Sonya and Queries

【题意:】

t次操作,每次操作有下述三种类型:

+ a 往multiset中增加一个非负整数a,允许相同的数出现

- a 从multiset中减去一个非负整数a,执行此操作时保证multiset存在该非负整数a

? s 询问multiset中有多少个数与模式串s匹配(匹配的定义:模式串中,‘0‘表示该位为偶数,‘1‘表示该位为奇数)

即s与a从右往左,相对应的奇偶性一致时(长度不一致时,在较短的前面补0),称为二者匹配

输出与模式串s匹配的数的个数

【分析:】

题目说a,s最多都是18位,而且要从后往前对应匹配,所以把字符串逆转同时还有其对应的01字符,然后利用map快速查找和删除

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <map>
using namespace std;
typedef long long LL;
const LL N=500;
struct b {
    string s1;//01
    string s2;
    bool operator<(const  b& other) const//操作符重载,否则报错
    {
        if (this->s1 < other.s1) return true;
        return false;
    }
};
map<b,int >mp;
int main()
{
    int n,i;
    cin>>n;
    while(n--) {
        getchar();
        string tmp;
        char c;
        cin>>c>>tmp;
        int len=tmp.length(),j=0;
        b t;
        for(i=len-1; j<=18; j++) {
            if(i>=0) {
                t.s1+=(tmp[i]-‘0‘)%2+‘0‘;
                t.s2+=tmp[i];
                i--;
            } else {
                t.s1+=‘0‘;
                t.s2+=‘0‘;
            }
        }
        if(c==‘+‘) {
            mp[t]++;
        } else if(c==‘-‘) {
            map<b,int>::iterator it;
            it=mp.find(t);
            if(it->second==1)
                mp.erase(t);
            else
                mp[t]--;
        } else if(c==‘?‘) {
            int ans=0;
            ans+=mp[t];//若是遍历的话会TLE
            cout<<ans<<endl;
        }
    }
    return 0;
}
/*

+ 200
+ 200
- 200
? 0
+ 200
? 0

*/
时间: 2024-11-08 22:33:04

Codeforces cf 713A Sonya and Queries的相关文章

Codeforces 713A. Sonya and Queries

题目链接:http://codeforces.com/problemset/problem/713/A 题意: Sonya 有一个可放置重复元素的集合 multiset, 初始状态为空, 现给予三种类型的操作: + ai : 把 ai 加入到集合 multiset 中, 可能出现重复元素. -  aj : 把 aj 从集合 multiset 中删除, 保证集合中一定存在这个元素. ? s  : 统计集合中现有的元素和模式串 s 匹配的个数.s 是一个 “01” 串, 其中 "0" 代表

(字典树)codeforces - 713A Sonya and Queries

原题链接:http://codeforces.com/problemset/problem/713/Attr 题意:一个集合,有三个操作,+-?,其中+和-和上一次cf的字典树那题是一个意思,?操作是统计满足01模式串的字典树中数的个数.如果模式串比字典中的数长就补全数,如果数长就补全模式串. 分析: 这题居然写了一个小时,一开始20分钟差不多写完了,但是一直坑在两种长度不同的情况上,后来仔细一想,卧槽,so easy啊,直接默认全部补全到18位不就行了..那样这题就是一个简单的求前缀的个数.

Educational Codeforces Round 23 F. MEX Queries(线段树)

题目链接:Educational Codeforces Round 23 F. MEX Queries 题意: 一共有n个操作. 1.  将[l,r]区间的数标记为1. 2.  将[l,r]区间的数标记为0. 3.  将[l,r]区间取反. 对每个操作,输出标记为0的最小正整数. 题解: hash后,用线段树xjb标记一下就行了. 1 #include<bits/stdc++.h> 2 #define ls l,m,rt<<1 3 #define rs m+1,r,rt<&l

把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend

1 //把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend 2 //dp[i][j]:把第i个数转成第j小的数,最小花费 3 //此题与poj 3666相似 a[i]转换成a[i]-i 4 5 #include <iostream> 6 #include <cstdio> 7 #include <cstdlib> 8 #include <algorithm> 9 #include <

Educational Codeforces Round 25 G. Tree Queries

题目链接:Educational Codeforces Round 25 G. Tree Queries 题意: 给你一棵树,一开始所有的点全是黑色,有两种操作. 1 x 将x这个点变为黑色,保证第一个操作是这个. 2 x 询问x到任意黑色的点的简单路径上的最小节点编号. 题解: 首先将一个变为黑色的点当成树根,然后dfs一下,预处理出所有点的答案. 然后开一个变量记录一下当前变黑的点的答案cur=min(cur,dp[x]). 每次询问的时候答案就是min(cur,dp[x]). 如果觉得很神

Codeforces Round #371 (Div. 2) C. Sonya and Queries(字典树)

题目戳这 题意:给你一个数字 n ,然后 n 组输入,如果第一个字符是+,就把后面的那个数字加入到集合里面去,如果第一个字符是减号,就把后面的那个数字从集合里面去掉一个,如果是问好,就开始配对,看看有多少个数字是和问号后面的数字是匹配的,是否配对的规则是,问好后面的数字都是二进制,一表示奇数,零表示偶数,如果集合中的数字长度和二进制的输入长度不一样,就把短的那个在前面加零,比如,二进制是101,集合中的数字是12,那就是101和012匹配,如果二进制是11,集合中的数字是12345,那么就是00

CF 713C Sonya and Problem Wihtout a Legend(DP)

原版题意:给定一个序列,每次操作给其中一个数$+1$或$-1$,问最少需要多少操作使得整个序列为不下降序列. 题解:不下降序列最后修改完成后的各个数一定是原序列中的某一个数.关于这个的理解看到网上的一个解释:原序列,从左到右扫过去,如果左边的大于右边的,要么左边的减掉使其等于右边的,要么右边的加上使其等于左边的. $dp[i][j]$:前i个数以原序列排序后的第j个数为结尾需要的最少操作. 状态转移方程:$dp[i][j]=min(dp[i][j-1],dp[i-1][j]+abs(a[i]-b

CodeForces - 710F:String Set Queries (二进制分组 处理 在线AC自动机)

ou should process m queries over a set D of strings. Each query is one of three kinds: Add a string s to the set D. It is guaranteed that the string s was not added before. Delete a string s from the set D. It is guaranteed that the string s is in th

Codeforces 396 E. Valera and Queries

题目链接:http://codeforces.com/problemset/problem/369/E 考虑将问题转化为有多少条线段没有覆盖这些点,如果一个询问的点集是${[x1,x2,...,xn]}$那么相当于询问有多少条线段在${\left [ 1,x1 \right )\bigcup (x1,x2)\bigcup ...(x_{n-1},x_n)\bigcup(x_n,1e6+1)}$这个范围内,所以离线询问,从左至右扫过去,每到一个点就把以这个点为右端点的线段的左端点的位置加入到树状数