题目链接
分析:01trie树,很容易就看出来了,也没什么好说的。WA了一发是因为没有看见如果数字位数大于01序列的时候01序列也要补全0。我没有晚上爬起来打,白天发现过的人极多。
/*****************************************************/ //#pragma comment(linker, "/STACK:1024000000,1024000000") #include <map> #include <set> #include <ctime> #include <stack> #include <queue> #include <cmath> #include <string> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <sstream> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define offcin ios::sync_with_stdio(false) #define sigma_size 26 #define lson l,m,v<<1 #define rson m+1,r,v<<1|1 #define slch v<<1 #define srch v<<1|1 #define sgetmid int m = (l+r)>>1 #define LL long long #define ull unsigned long long #define mem(x,v) memset(x,v,sizeof(x)) #define lowbit(x) (x&-x) #define bits(a) __builtin_popcount(a) #define mk make_pair #define pb push_back #define fi first #define se second const int INF = 0x3f3f3f3f; const LL INFF = 1e18; const double pi = acos(-1.0); const double inf = 1e18; const double eps = 1e-9; const LL mod = 1e9+7; const int maxmat = 10; const ull BASE = 31; /*****************************************************/ const int maxn = 3e5 + 5; int ch[maxn][2]; int sz = 1; LL val[maxn]; void addnode(LL x) { LL base = 1; int u = 0; for (int i = 0; i < 18; i ++) { int c = (x / base) % 10; c %= 2; if (!ch[u][c]) { ch[u][c] = sz ++; mem(ch[sz], 0); val[sz] = 0; } u = ch[u][c]; base *= 10LL; } val[u] ++; } void deletenode(LL x) { LL base = 1; int u = 0; for (int i = 0; i < 18; i ++) { int c = (x / base) % 10; c %= 2; u = ch[u][c]; base *= 10LL; } val[u] --; } int searchnode(char *s) { int len = strlen(s); LL ans = 0; int u = 0, c; for (int i = 0; i < 18; i ++) { if (i < len) c = s[len - 1 - i] - '0'; else c = 0; u = ch[u][c]; ans += val[u]; } return ans; } int main(int argc, char const *argv[]) { int N; cin>>N; char op[2]; char s[20]; LL x; for (int i = 0; i < N; i ++) { scanf("%s", op); if (op[0] == '+') { cin>>x; addnode(x); } else if (op[0] == '-') { cin>>x; deletenode(x); } else { scanf("%s", s); cout<<searchnode(s)<<endl; } } return 0; }