題目大意:
題意:給你n個數,然後給你m組詢問,每組詢問給你乙個數,輸出n個數中與該數亦或
的最大的那個數,輸出的是被亦或的那個數,不是亦或後的結果。
給你n個數,然後給你m組詢問,每組詢問給你乙個數,輸出n個數中與該數亦或
的最大的那個數,輸出的是被亦或的那個數,不是亦或後的結果。
思路:我用的是字典樹+貪心,首先我們可以把前n個數拆成2進製,然後補全前導0,
我是補成了34位,然後把他存在字典樹中,對於每個詢問,把他變成二進位制,然後補全前導0,然後在把每一位都取反,在字典樹上查詢,查詢的時候用貪心的思想,因為前面的是高位,所以相等就走相等的,不行再走不相等的那個,反正都是34位,怎麼走都有路,一直找到最後,在某一位上如果當前這一位一樣了,那麼sum += 當前這一位的權值(2^**),然後return sum,輸出的時候不能直接輸出sum求的是被異或的那個值,所以輸出 sum ^ num
此大佬講的也不錯:
**(01字典樹模板)
#include #include #include #include #include #include #include #include #include #include #include #include #define ri(n) scanf("%d",&n)
#define oi(n) printf("%d\n",n)
#define rl(n) scanf("%lld",&n)
#define ol(n) printf("%lld\n",n)
#define rep(i,l,r) for(i=l;i<=r;i++)
#define rep1(i,l,r) for(i=l;inext[id]==null)
else
p=p->next[id];
}}ll find(char *s)
else
k/=2;
}return sum;
}void getstr(ll x)
for(int i=t-1; i>=0; i--)
str[i]='0';
}int main()
printf("case #%d:\n",++kases);
for(int i=1; i<=m; i++)
}return 0;
}
總結下單詞字典樹:
1、查詢單詞是否出現
**:
/*
trie tree的儲存方式:將字母儲存在邊上,邊的節點連線與它相連的字母
trie[rt][x]=tot:rt是上個節點編號,x是字母,tot是下個節點編號
*/ #include#include#include#include#define maxn 2000010
using namespace std;
int tot=1,n;
int trie[maxn][26];
//bool isw[maxn];查詢整個單詞用
void insert(char *s,int rt)
rt=trie[rt][x];//為下個字母的插入做準備
}/*isw[rt]=true;標誌該單詞末位字母的尾結點,在查詢整個單詞時用到*/
}bool find(char *s,int rt)
return true;
//查詢整個單詞時,應該return isw[rt]
}char s[22];
int main()
scanf("%d",&n);
for(int i=1;i<=n;i++)
return 0;
}陣列模擬
2、查詢字首出現次數
**:
#include#include#include#includeusing namespace std;
int trie[400001][26],len,root,tot,sum[400001];
bool p;
int n,m;
char s[11];
void insert()
scanf("%d",&m);
for(int i=1;i<=m;i++)
}陣列模擬
字典樹 與 01字典樹
字典樹可以降低空間複雜度 01字典樹可以降低時間複雜度。字典樹 又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較...
01字典樹 小結
為了做13年南京網路賽的一道題 學了這個01字典樹 看了別人的模板 之後切了幾道水題 現在總結一下 01字典樹的實現可以看成是把乙個數的二進位制字元化後插入到一顆一般的字典樹中 比如在01字典樹種插入3時 相當於在字典樹中插入00 00011 一共33為,這個根據具體實現不同 查詢最大異或值的時候我...
01字典樹 OR問題
01字典樹 用途 解決區間異或和之類的問題 異或的性質 1.交換律 2.結合律,即 a b c a b c 3.自反性,即x x 0 4.x 0 x 有上述性質,對於區間異或和要知道此性質xor l,r xor 1,l 1 xor 1,r 注意 int型別1 31會溢位 區間異或和的題目 比如給一組...