题链接 https://nanti.jisuanke.com/t/39277

好久不见我又回来了,这题要考虑他在问啥。这题要找子路径包含 异或和为0的路径 的路径的数量,而且有些许重复,枚举所有异或和为0 的路径,把他们的所有父路径列出来。
题解
如果x p在一条链子上,那就(siz[p])*( n - siz[x的儿子]),如果不在一条链子上,那就siz[x] * siz[p]; 值得注意的是,本题解选自https://blog.csdn.net/qq_42211531/article/details/96286606?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.nonecase
看代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int maxn = 5e5 + 11;
const ll mod = 1000000007;
unordered_map<ll, ll>ins;
struct Node {
int p;
ll len;
Node(int a, ll l) :p(a), len(l) {}
};
vector<Node>G[maxn];
void add(int x, int y,ll len) {
G[x].push_back(Node(y, len));
}
ll chal[maxn];
ll siz[maxn];
int dfs(int x, int fa) {
siz[x] = 1;
for (int i = 0; i < G[x].size(); i++) {
int p = G[x][i].p;
ll len = G[x][i].len;
if (p == fa) continue;
chal[p] = chal[x] ^ len;
dfs(p, x);
siz[x] += siz[p];
}
return 0;
}
ll ans = 0;
int dfs1(int x, int fa) {
ans = (ans + siz[x] * ins[chal[x]]) % mod;
for (int i = 0; i < G[x].size(); i++) {
int p = G[x][i].p;
ll len = G[x][i].len;
if (p == fa) continue;
dfs1(p, x);
}
ins[chal[x]] += siz[x];
return 0;
}
ll n;
int dfs2(int x, int fa) {
ans = (ans + siz[x] * ins[chal[x]]) % mod;
for (int i = 0; i < G[x].size(); i++) {
int p = G[x][i].p;
ll len = G[x][i].len;
if (p == fa) continue;
ins[chal[x]] += n - siz[p];
dfs2(p, x);
ins[chal[x]] -= n - siz[p];
}
return 0;
}
int main() {
cin >> n;
for (int i = 2; i <= n; i++) {
int y;
ll len;
cin >> y >> len;
add(i, y, len);
add(y, i, len);
}
dfs(1, -1);
ins.clear();
dfs1(1, -1);
ins.clear();
dfs2(1, -1);
printf("%lld
", ans);
return 0;
}