鏈結
給定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...