题意:
有n次操作,每次操作有三种:
① 加上一个数。
② 减去一个一定有的数。
③ 查询一个数,问相匹配的已有的数总共有多少个。
n<= 100 000,x的位数不超过18
匹配:当两个数从个位开始每位数的奇偶性相同。不足的补零。
题解:
sample:
input
12
+ 1
+ 241
? 1
+ 361
- 241
? 0101
+ 101
? 101
- 101
? 101
+ 4000
? 0
output
2
1
2
1
1
很明显我们仅需处理一下,每个数在18位上的奇偶性,组成一个二进制数。然后dp[y]加加减减或查询。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define M 18
int dp[1<<M],n;
void add(long long x,int v){
int y=0;
for(int i=0;i<18;++i){
y+=(1<<i)*(x&1);
x/=10;
}
dp[y]+=v;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
char a[3];
long long x;
scanf("%s",a);
if(a[0]=='+'){
cin>>x;
add(x,1);
}else if(a[0]=='-'){
cin>>x;
add(x,-1);
}else {
char b[20];
scanf("%s",b);
int len=strlen(b);
int y=0;
for(int j=len-1,k=0;~j;--j,++k)
y+=(1<<k)*(b[j]^48);
printf("%d\n",dp[y]);
}
}
return 0;
}