字典樹 陣列的前後部分數異或的最大值

2021-07-13 11:12:09 字數 2069 閱讀 5107

一家日企的筆試題,實驗室乙個師兄投了一家日企的開發崗位,他們的筆試題是二選一,只要最後截止日期前向規定的郵箱傳送**即可,他們會通過驗證**的時間複雜度和空間複雜度來決定是否參加面試。其中一道就是:

輸入乙個整型陣列,假定陣列中前x個數和後y個數的異或值為a,求出a的最大值,並且在最大值情況下的兩個下標。

分析;因為要考慮時間複雜度和空間複雜度,因而肯定不能採用把每種情況都計算一遍,然後求得最大值,只能採用其他辦法,字典樹的思想可以應用。字典樹的乙個典型應用就是比較相同的字首的單詞,(例如在給定大量的單詞中,有band ,banana,bee,ban,abc中,字首為ba的有3個,ban的也有三個,b的有4個,這時我們假定都是小寫單詞,那麼每個節點的子樹有26個,依次為a到z,這樣每乙個單詞都是一條從根節點到葉子節點的路徑,這就是字典樹,在建立完成後,當輸入要查詢的字首時,便可以直接查詢到,例如ba,可以先查詢根節點的第二個子節點是否存在,若存在,則查詢b的乙個子節點是否存在,如果存在就輸出該節點的value值,就是次數,**一會也會貼出來,回到正題)在這裡,字典樹的層高是固定的就是32位,每乙個節點都是0或者1(也可以理解為固定層高的二叉樹),陣列的假設為1、 2、3、4、5;1本身的二進位制存到樹裡面,1、2的異或值也是乙個32位的,存到樹裡面,1、2、3的異或值也存進去,以此類推,直到1、 2、3、4、5。然後從後面開始向前遍歷,先是5,要想總的異或值最大,則要跟5的二進位制表示中0的位置為1,1的位置為0,(5的二進位制為00000000000000000000101,則使其異或值最大的值為1111111111111111111010)先在樹中查詢使5的異或值最大的值,然後再查詢使4、5的異或值最大的值,以此類推,最後輸出最大的異或值,並輸出前後的下標。

#include #include using namespace std;

#define max 2

typedef struct trietrie;

trie *root = new trie();

void creattrie(int *str,int location,int m) //建立字典樹的過程,

else

for (int j=0;jnext[j]=null;

}c_root->next[id]=p;

c_root=c_root->next[id];

} else

}}void binarycout(int m,int n) //求32位的二進位制,並儲存在乙個陣列裡

} trie findtrielocation(int *str) //

else

}

else

else

} }return *f_root;

}int main()

int num[50];

int i=0,length;

int m;

while(cin>>m)

length=i;

int tmp=0;

for (int k=0;k=0;--j) }

cout<

注意一點,因為沒有限制陣列的個數,因而在輸入完成後先ctrl+c,然後回車,這樣就可以出結果,ctrl+c是判斷結束的標識。

最後再附乙個查詢字首的**

#include //字典樹的乙個模板和典型應用

using namespace std;

#define max 26

typedef struct trietrie;

trie *root = new trie();

void creattrie(char *str)

c_root->next[id]=p;

c_root=c_root->next[id];

} else

i++;

}}int findtrie(char *str)

}return f_root->v;

}int main()

char str[20];

while (gets(str)&&str[0]!='\0')

char str1[20];

while (gets(str1))

{ cout<

最後還是煩請多指正喲

CSU 1216 異或最大值 字典樹的應用

題意 給定一些數,求這些數中兩個數的異或值最大的那個值 思路 字典樹的運用,每一次貪心的去找所需要的數字,用ret儲存路上經過節點的資訊 具體看 include include include include include include include include include inclu...

關於區間異或的線段樹

題 題意 倆個操作,操作1 l,r,x 區間 l,r 的數全部異或上x。操作2 l r 輸出區間 l,r 和 分析 對陣列a建線段樹,對於線段樹的每乙個節點進行二進位制拆位,每個位就統計有多少個1,更新操作對於涵蓋區間的二進位制位就等於其長度減去更新前的1的個數 includeusing names...

1720 解碼異或後的陣列

題目描述 未知 整數陣列 arr 由 n 個非負整數組成。經編碼後變為長度為 n 1 的另乙個整數陣列 encoded 其中 encoded i arr i xor arr i 1 例如,arr 1,0,2,1 經編碼後得到 encoded 1,2,3 給你編碼後的陣列 encoded 和原陣列 a...