#include<bits/stdc++.h> // 包含所有常用标准库,竞赛中常用
using namespace std;
// 定义常量,数组最大长度
const int N=600;
// 全局变量声明
int n,L,R; // n:字符串长度 L/R:分割后0和1数量差的上下限
string s; // 输入的01字符串
int dp[N][N]; // dp[i][j]表示区间[i,j]能分割出的最大段数
int sum_zero[N],sum_one[N]; // 前缀和数组,sum_zero[i]表示前i个字符中0的数量,sum_one同理
// 核心动态规划求解函数
void solve(){
// 枚举区间长度,从2开始(长度为1的区间无法分割)
for(int len=2;len<=n;len++){
// 枚举区间起点i,保证终点j不越界
for(int i=1;i<=n-len+1;i++){
int j=i+len-1; // 计算区间终点j
// 枚举分割点k,将区间[i,j]拆分为[i,k]和[k+1,j]
for(int k=i;k<j;k++){
// 计算[i,k]区间内0的数量
int pos1=sum_zero[k]-sum_zero[i-1];
// 计算[k+1,j]区间内1的数量
int pos2=sum_one[j]-sum_one[k];
// 计算0和1数量的绝对差值
int tp=abs(pos1-pos2);
// 如果差值在[L,R]范围内,满足分割条件
if(tp>=L&&tp<=R){
// 更新dp[i][j]为当前最大值
// 分割后段数 = 左区间段数 + 右区间段数 + 1(本次分割)
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+1);
}
}
}
}
// 输出整个字符串[1,n]能分割出的最大段数
cout<<dp[1][n]<<endl;
return;
}
// 预处理前缀和数组
void pre(){
// 从1开始遍历(方便前缀和计算,避免处理0边界)
for(int i=1;i<=n;i++){
// 继承前一个位置的前缀和
sum_zero[i]=sum_zero[i-1],sum_one[i]=sum_one[i-1];
// 字符串s是0下标,判断当前字符是0还是1,更新对应前缀和
if(s[i-1]=='0') sum_zero[i]++;
else sum_one[i]++;
}
return;
}
int main(){
// 加速cin/cout输入输出
ios::sync_with_stdio(false);
cin.tie(0);
// 输入:字符串长度n,差值下限L,差值上限R
cin>>n>>L>>R;
// 输入01字符串
cin>>s;
// 预处理前缀和
pre();
// 动态规划求解
solve();
return 0;
}