暴力即可:枚举起点dfs。理论上时间复杂度为, 不过由于路径值增长很快(每加一位数,相当于乘以2,大于
后即可剪枝),因此单次dfs深度不超过
,因此实际时间复杂度为
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
long long n, l, r;
cin >> n >> l >> r;
string s;
cin >> s;
vector<vector<int>> adj(n + 1, vector<int>());
for (int i = 1; i <= n - 1; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
long long ans = 0;
auto dfs = [&adj, &s, l, r, &ans](auto self, int src, int fa,
long long num)->void {
if (num > r || num < 0) return;
for (auto v : adj[src]) {
if (v == fa) continue;
long long cur = (num << 1) | (s[v - 1] - '0');
if (l <= cur && cur <= r) ans ++;
self(self, v, src, cur);
}
};
for (int i = 1; i <= n; i++) {
dfs(dfs, i, 0, s[i - 1] - '0');
}
cout << ans;
}
// 64 位输出请用 printf("%lld")

京公网安备 11010502036488号