Trie 樹上異或路徑的應用

2021-09-25 12:14:13 字數 2859 閱讀 7286

鏈結

給定n個字串s1,s2…sn,接下來進行m次詢問,每次詢問給定乙個字串t,求s1~sn中有多少個字串是t的字首。

輸入字串的總長度不超過106,僅包含小寫字母。

輸入格式

第一行輸入兩個整數n,m。

接下來n行每行輸入乙個字串si。

接下來m行每行乙個字串t用以詢問。

輸出格式

對於每個詢問,輸出乙個整數表示答案。

每個答案佔一行。

輸入樣例:

3 2ab

bcabc

abcefg

輸出樣例:20

#include

#include

using namespace std;

const

int size=

1e6;

int n,m,trie[26]

[size]

,tot =

1,endn[size]

;string s;

void

insert

(string str)

endn[p]++;

}int

search

(string str)

return ans;

}int

main()

for(

int i=

1;i<=m;i++

)}

(

在給定的n個整數a1,a2……an中選出兩個進行xor(異或)運算,得到的結果最大是多少?

輸入格式

第一行輸入乙個整數n。

第二行輸入n個整數a1~an。

輸出格式

輸出乙個整數表示答案。

資料範圍

1≤n≤105,

0≤ai<231

輸入樣例:

31 2 3

輸出樣例:

3把乙個數拆分成32位數(其實這題拆分成31就夠了),然後跑一遍trie,盡量選擇和當前數的數字不同的,從高到低保證貪心的可行性,如果無法選到就選另外一條路的。

#include

#include

using namespace std;

const

int size=

1e5+

100;

int n,m,trie[2]

[size*32]

,tot =

1,endn[size]

;string s;

void

insert

(int x)

}int

search

(int x)

else

p = trie[ch]

[p];

}return ans;

}int

main()

cout << ans << endl;

}

傳送門

給定乙個樹,樹上的邊都具有權值。

樹中一條路徑的異或長度被定義為路徑上所有邊的權值的異或和:

formula.png

⊕ 為異或符號。

給定上述的具有n個節點的樹,你能找到異或長度最大的路徑嗎?

輸入格式

第一行包含整數n,表示樹的節點數目。

接下來n-1行,每行包括三個整數u,v,w,表示節點u和節點v之間有一條邊權重為w。

輸出格式

輸出乙個整數,表示異或長度最大的路徑的最大異或和。

資料範圍

1≤n≤100000,

0≤u,v1->2,值為7 (=3 ⊕ 4)

乍一眼看,樹上路徑異或和,樹剖?線性基?其實還是 trie ,用到樹上異或和的可減性質,可以預處理類似字首和的根節點到每個子節點的路徑異或和,然後就轉化為了只要在n個樹中差分選擇乙個最大的差分值就ok。n<=1e5,n方配對肯定不行,所以又轉化到了上題的trie樹求解方式。

#include

#define ll long long

using namespace std;

const

int maxn=2*

1e5+

100;

ll v[maxn]

,ver[maxn]

,edge[maxn]

,nextr[maxn]

,head[maxn]

,sum[maxn]

,trie[2]

[maxn*16]

;int n,tot=1;

inline ll read()

//快速讀入

inline

void

add(

int x,

int y,

int z)

inline

void

dfs(

int x)}}

inline

void

insert

(int x)

}inline ll search

(int x)

else

}return ans;

}int

main()

memset

(sum,0,

sizeof

(sum));

dfs(1)

; tot =1;

ll ans =0;

for(

int i=

1;i<=n;i++

) cout << ans ;

}

一直從報錯segmentation fault,調了好久才把這個題調出來,原來是trie陣列開小了,在這裡記得要開 32* size。

最長異或路徑 trie樹 題解

題意 給你一棵樹,有邊權,定義兩點之間的價值為這連線兩點的這條路徑上所有邊權的異或和,如1 2 1 rightarrow 2 1 2所經過的邊權為1,2 31,2,3 1,2,3,那麼1 2 1 rightarrow 2 1 2的權值就為1 2 3 3 1 bigoplus2 bigoplus3 3...

AcWing 144 最長異或值路徑(Trie)

題目大意 一棵樹,邊有權值。現在定義路徑的值為路徑中邊的權值的異或值,求異或值最大的路徑。題解 從a到b路徑的異或值 a到根結點的異或值 b到根結點的異或值。這樣求出每個點到根結點的異或值,然後從n個數中選出異或值最大的數就可以。把n個數插入trie樹中做。include include inclu...

異或的路徑

思路 dfs處理出根節點到全部節點的異或值,然後對每一位二進位制計算貢獻 第i位就是2 i的貢獻,而貢獻的數量就是0和1的數量積,因為只有端點是0和1路徑異或後才是1,該位才會1 最好乘二是終起點可以調換 include include include include include include...