某道题的题解
  • 板块灌水区
  • 楼主SanM_10492
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/20 12:16
  • 上次更新2024/10/20 14:12:23
查看原帖
某道题的题解
1009691
SanM_10492楼主2024/10/20 12:16
#include<iostream>
using namespace std;
const int N=64e5+10;
using LL=long long;
struct NODE{
	int ch[2];
	int cnt;
	int siz;
}trie[N];
int n;

string to2(LL val){
	string ans;
	do{
		int r=val&1;
		val>>=1;
		ans=(char)(r+'0')+ans;
	}while(val);
	return ans;
}
void insert(string s){
	int u=0;
	for(int i=0;i<s.size();i++){
		int c=s[i]-'0';
		if(trie[u].ch[c]==0) trie[u].ch[c]=++n;
		u=trie[u].ch[c];
		trie[u].siz++;
	}
	trie[u].cnt++;
}
int query(string s){
	int u=0,ans=0;
	for(int i=0;i<s.size();i++){
		int c=s[i]-'0';
		int l=trie[u].ch[0],lsiz=0;
		if(l!=0) lsiz=trie[l].siz;
		ans+=trie[u].cnt;
		if(c==1) ans+=lsiz;
		if(trie[u].ch[c]==0) break;
		u=trie[u].ch[c];
	}
	return ans;
}
int main(){
	int q,op;
	LL x;
	cin>>q;
	while(q--){
		cin>>op>>x;
		if(op==1) insert(to2(x));
		else cout<<query(to2(x))<<endl;
	}
	return 0;
}
2024/10/20 12:16
加载中...