給定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。...