《演算法競賽高階指南》1 6Trie

2021-09-22 21:04:17 字數 3414 閱讀 3474

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

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

輸入格式

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

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

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

輸出格式

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

每個答案佔一行。

輸入樣例:

3 2ab

bcabc

abcefg

輸出樣例:20

#include

using namespace std;

const

int n =

1000010

, m =

500000

;//trie 的長度

int n, m;

int son[m][26

], cnt[n]

, idx;

//cnt記錄該節點是多少個字串的末尾節點 idx 虛擬記憶體的指標(當前用到的陣列的位址,當前節點的下標)

char str[n]

;int

query()

//查詢 字串字首個數

return res;

}void

insert()

//插入

cnt[p]++;

//有乙個單詞以p節點為結尾 加1

}int

main()

while

(m --

)return0;

}

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

輸入格式

第一行輸入乙個整數n。

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

輸出格式

輸出乙個整數表示答案。

資料範圍

1≤n≤105,

0≤ai<231

輸入樣例:

31 2 3

輸出樣例:

3

#include

#include

using namespace std;

const

int n =

100010

, m =

3000000

;//m節點個數

int n;

int son[m][2

],idx;

int a[n]

;void

insert

(int x)

}int

query

(int x)

else p = son[p]

[s];

}return res;

}int

main()

int res =0;

for(

int i =

0; i < n; i++

) res =

max(res,

query

(a[i]))

;//query 找到和當前異或最大的結果

cout << res << endl;

return0;

}

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

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

⊕ 為異或符號。

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

輸入格式

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

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

輸出格式

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

資料範圍

1≤n≤100000,

0≤u,v輸入樣例:

40 1 3

1 2 4

1 3 6

輸出樣例:

7樣例解釋

樣例中最長異或值路徑應為0->1->2,值為7 (=3 ⊕ 4)

#include

#include

#include

using namespace std;

const

int n =

100010

, m =

3000000

;//m節點個數

int n;

int h[n]

, e[n *2]

, c[n *2]

, ne[n *2]

, cnt;

//樹:陣列模擬鄰接表來存,e無向圖,邊數*2,c是邊權,ne存next指標,cnt記憶體,當前位下標

int son[m][2

],idx;

int a[n]

;void

add(

int u,

int v,

int w)

//把u,v加到圖裡面去

void

dfs(

int u,

int father,

int sum)

}void

insert

(int x)

}int

query

(int x)

else p = son[p]

[s];

}return res;

}int

main()

dfs(0,

-1,0

);//從根節點0開始,-1 無向圖遍歷常用方式 出邊等於父節點 不回溯 ,sum 開始為 0

for(

int i =

0; i < n; i++

)insert

(a[i]);

//根節點到i的路徑所有邊權的xor值

int res =0;

for(

int i =

0; i < n; i++

) res =

max(res,

query

(a[i]))

;//query 找到和當前異或最大的結果

cout << res << endl;

return0;

}

演算法競賽高階指南 字首統計 Trie

description 給定n個字串s1,s2 sn,接下來進行m次詢問,每次詢問給定乙個字串t,求s1 sn中有多少個字串是t的字首。輸入字串的總長度不超過106,僅包含小寫字母。字串 s1 不妨假設長度為 n 被稱為字串 s2 的字首,當且僅當 s2 的長度不小於 n,且 s1 與 s2 前 n...

《演算法競賽高階指南》0x16Trie 求最大異或對

給定乙個長度為n的序列,求乙個最大的逆序對。利用trie,每個整數都在樹的底部,沿著二進位制位進行延伸,匹配的時候優先匹配不同位,因為不同位翻轉之後能加在結果上。includeusing namespace std define maxn 100010 int trie maxn 32 2 int ...

《演算法競賽高階指南》 防曬

有c頭奶牛進行日光浴,第i頭奶牛需要minspf i 到maxspf i 單位強度之間的陽光。每頭奶牛在日光浴前必須塗防曬霜,防曬霜有l種,塗上第i種之後,身體接收到的陽光強度就會穩定為spf i 第i種防曬霜有cover i 瓶。求最多可以滿足多少頭奶牛進行日光浴。輸入格式 第一行輸入整數c和l。...