Codeforces714C【映射】

题意:
T次操作;
+的话就是往 multiset 塞进一个;
-的话就是往 multiset 去除一个;
?操作
思路:
+和-操作就是处理字符串直接实现一个原字符串改成”01“的映射,
然后去问下,对于每个数字可以搞成18个长度的,然后+1,然后询问一下就好了;
中间如果碰到1的话就说明比他短的都不能匹配,因为比他短的只能是往左添0…
挫代码贴一发:

#include <bits/stdc++.h>
#include <string>
using namespace std;
typedef __int64 LL;
map<string,int>mp;
int main()
{
    char x[2];
    string tmp,t1,t2;
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s",x);
        if(strcmp(x,"+")==0)
        {
            cin>>tmp;
            t1.clear();
            string::iterator it;
            for(it=tmp.begin();it!=tmp.end();it++)
            {
                if((*it-'0')%2)
                    t1+="1";
                else
                    t1+="0";
            }
            mp[t1]++;
        }
        else if(strcmp(x,"-")==0)
        {
            cin>>tmp;
            t1.clear();
            string::iterator it;
            for(it=tmp.begin();it!=tmp.end();it++)
            {
                if((*it-'0')%2)
                    t1+="1";
                else
                    t1+="0";
            }
            mp[t1]--;
        }
        else
        {
            int ans;
            ans=0;
            cin>>tmp;
            ans+=mp[tmp];
            t1=tmp;
            while(tmp[0]!='1')
            {
                t1=t1.substr(1);
                if(t1.empty())
                    break;
                ans+=mp[t1];
                if(t1[0]=='1')
                    break;
            }
            t1.clear();
            t2="0";
            while(1)
            {
                t1=t2+tmp;
                if(t1.size()>18)
                    break;
                tmp=t1;
                ans+=mp[tmp];
            }
            printf("%d
",ans);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934792.html