codeforces 706D trie树 或 muliset
2016-08-13 17:09
387 查看
题意:插入,删除,询问三个操作。
分析:显然trie树都支持这三个操作,但是代码比较长,用muliset更短小精悍。但是两者的本质都是一样,都是找与二进制不同的,尽量凑成全是1.
muliset
#include<bits/stdc++.h>
using namespace std;
multiset<int> dp;
bool check(int a,int b)
{
auto it = dp.lower_bound(a);
if(it == dp.end()) return false;
if(*it < b) return true;
else return false;
}
int solve(int x)
{
int ans = 0;
for(int i = 30; i >= 0 ; i --)
{
if(!((x>>i)&1)) ans |= 1<<i;
if(!check(ans , ans + (1<<i))) ans ^= 1<<i;
}
return ans^x;
}
int main(void)
{
int q,a;
char c;
cin>>q;
dp.insert(0);
while(q--)
{
cin>>c>>a;
if(c=='+')
dp.insert(a);
else if(c == '-')
{
auto it = dp.find(a);
dp.erase(it);
}
else cout<<solve(a)<<endl;
}
} trie树
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 20;
struct Trie
{
int ch[maxn<<5][2],val[maxn<<5],sz = 0;
void inin(){
sz = 1;memset(ch[0],0,sizeof(ch[0]));
}
void insert(int x,int v)
{
int u = 0;
for(int i = 30 ; i >=0 ; i--)
{
int c = (x>>i) &1;
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
val[u] += v;
}
}
int query(int x)
{
int ans = 0,u = 0;
for(int i = 30 ; i >= 0; i --)
{
int id = (x >> i) & 1;
if(!ch[u][id^1] || !val[ch[u][id^1]])
u = ch[u][id];
else
{
u = ch[u][id^1];
ans |= 1<<i;
}
}
return ans;
}
}tree;
int main(void)
{
tree.inin();
int q,a;
char c;
cin>>q;
tree.insert(0,1);
while(q--)
{
cin>>c>>a;
if(c=='+')
tree.insert(a,1);
else if(c == '-')
{
tree.insert(a,-1);
}
else cout<<tree.query(a)<<endl;
}
}
分析:显然trie树都支持这三个操作,但是代码比较长,用muliset更短小精悍。但是两者的本质都是一样,都是找与二进制不同的,尽量凑成全是1.
muliset
#include<bits/stdc++.h>
using namespace std;
multiset<int> dp;
bool check(int a,int b)
{
auto it = dp.lower_bound(a);
if(it == dp.end()) return false;
if(*it < b) return true;
else return false;
}
int solve(int x)
{
int ans = 0;
for(int i = 30; i >= 0 ; i --)
{
if(!((x>>i)&1)) ans |= 1<<i;
if(!check(ans , ans + (1<<i))) ans ^= 1<<i;
}
return ans^x;
}
int main(void)
{
int q,a;
char c;
cin>>q;
dp.insert(0);
while(q--)
{
cin>>c>>a;
if(c=='+')
dp.insert(a);
else if(c == '-')
{
auto it = dp.find(a);
dp.erase(it);
}
else cout<<solve(a)<<endl;
}
} trie树
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 20;
struct Trie
{
int ch[maxn<<5][2],val[maxn<<5],sz = 0;
void inin(){
sz = 1;memset(ch[0],0,sizeof(ch[0]));
}
void insert(int x,int v)
{
int u = 0;
for(int i = 30 ; i >=0 ; i--)
{
int c = (x>>i) &1;
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
val[u] += v;
}
}
int query(int x)
{
int ans = 0,u = 0;
for(int i = 30 ; i >= 0; i --)
{
int id = (x >> i) & 1;
if(!ch[u][id^1] || !val[ch[u][id^1]])
u = ch[u][id];
else
{
u = ch[u][id^1];
ans |= 1<<i;
}
}
return ans;
}
}tree;
int main(void)
{
tree.inin();
int q,a;
char c;
cin>>q;
tree.insert(0,1);
while(q--)
{
cin>>c>>a;
if(c=='+')
tree.insert(a,1);
else if(c == '-')
{
tree.insert(a,-1);
}
else cout<<tree.query(a)<<endl;
}
}
相关文章推荐
- Codeforces 706D Trie树/multiset
- Codeforces 706D-Vasiliy's Multiset(Trie树)
- codeforces 706D. Vasiliy's Multiset 带删除操作的字典树(真模版)
- codeforces 710F Trie树+kmp Trie树板子和kmp板子
- [Codeforces 557E] Ann and Half-Palindrome (Trie树+子串排序)
- Codeforces 655E Beautiful Subarrays【01trie树】
- Codeforces 665E Beautiful Subarrays【01trie树】
- codeforces 665E E. Beautiful Subarrays(trie树)
- codeforces 706D (字典树)
- Codeforces 557E Ann and Half-Palindrome (Trie树)
- Codeforces 665E. Beautiful Subarrays (trie树)
- Codeforces 665E Beautiful Subarrays (Trie树)
- Codeforces 615C Running Track(DP + Trie树)
- Watto and Mechanism - CodeForces 514 C Trie树
- Sausage Maximization - CodeForces 282 E Trie树
- Codeforces 514C Watto and Mechanism Trie树 + dfs
- codeforces 706D D. Vasiliy's Multiset(trie树)
- codeforces 706D(字典树)
- Codeforces-948D:Perfect Security(Trie树)
- 字符串哈希 Trie树 Watto and Mechanism : CodeForces - 514C