#include <iostream>
#include <vector>
#include <string>
#include <functional>

using i64 = long long;

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  std::cout.tie(nullptr);

  int n;
  i64 l,r;
  std::cin >> n >> l >> r;

  std::string s;
  std::cin >> s;

  std::vector<std::vector<int>> adj(n);
  for(int i = 0; i < n-1; i++){
    int u,v;
    std::cin >> u >> v;
    u--,v--;

    adj[u].push_back(v);
    adj[v].push_back(u);
  }

  int ans = 0;
  std::function<void(int,int,int,i64)> dfs = [&](int u,int fa,int cnt,i64 cur){
    if(cur > r){
      return;
    }
    if(cur >= l && cnt > 0){
      ans++;
    }

    for(const auto& v:adj[u]){
      if(v == fa){
        continue;
      }

      dfs(v,u,cnt+1,(cur<<1)+s[v]-'0');
    }
  };

  for(int u = 0; u < n; u++){
    dfs(u,-1,0,s[u]-'0');
  }

  std::cout << ans << "\n";
}
import sys
sys.setrecursionlimit(100000)

input = lambda : sys.stdin.readline().strip()

n,l,r = map(int,input().split())

s = input()

adj = [[] for i in range(n)]

for i in range(n-1):
  u,v = map(lambda x: int(x)-1,input().split())
  adj[u].append(v)
  adj[v].append(u)

ans = 0
def dfs(u,fa,cnt,cur):
  global ans
  if cur > r:
    return
  if cur >= l and cnt > 0:
    ans += 1
  for v in adj[u]:
    if v == fa:
      continue
    dfs(v,u,cnt+1,(cur<<1) | (ord(s[v])-ord('0')))

for i in range(n):
  dfs(i,-1,0,ord(s[i])-ord('0'))

print(ans)