思路:dfs處理出根節點到全部節點的異或值,然後對每一位二進位制計算貢獻;第i位就是2^i的貢獻,而貢獻的數量就是0和1的數量積,因為只有端點是0和1路徑異或後才是1,該位才會1;最好乘二是終起點可以調換;
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define sfi(i) scanf("%d",&i)
#define sfs(i) scanf("%s",(i))
#define pri(i) printf("%d\n",i)
#define sff(i) scanf("%lf",&i)
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
#define inf 0x3f3f3f3f
#define eps 1e-16
#define pi acos(-1)
#define lowbit(x) ((x)&(-x))
#define zero(x) (((x)>0?(x):-(x))'9')
while(ss>='0'&&ss<='9')
return f*x;
}vector>g[maxn];
int n;
int val[maxn];
void add(int u,int v,int w));}
void dfs(int u)
dfs(1);
ll ans=0;
for(int i=0;i<=20;i++)
ans=ans+(yi*(n-yi)%mod)*((1l
}cout<}
最長異或路徑
題目鏈結 戳我前置知識 什麼是異或?如果二進位制下同一位不相同,則為 1 否則為 0 trie樹 基本位運算 對於同一條邊異或兩次,相當於沒有進行異或,我們將dis i 表示為從i點到根節點的路徑異或和。則問題轉化為了求兩點的dis異或最大值 貪心的想,對於乙個數x,我們對於dis i x最大,則每...
異或的路徑 樹形DP
給一棵 n 個點的樹,1 號節點為根,邊有邊權,令 f u,v 表示 u 節點到 v 節點,路徑上邊權異或值。求 i 1n j 1nf i,j sum sum f i,j i 1n j 1n f i,j 結果對 1000000007 取模。第一行乙個整數 n n 100000 n n leq 100...
Trie 樹上異或路徑的應用
鏈結 給定n個字串s1,s2 sn,接下來進行m次詢問,每次詢問給定乙個字串t,求s1 sn中有多少個字串是t的字首。輸入字串的總長度不超過106,僅包含小寫字母。輸入格式 第一行輸入兩個整數n,m。接下來n行每行輸入乙個字串si。接下來m行每行乙個字串t用以詢問。輸出格式 對於每個詢問,輸出乙個整...