B
题意:给出一个01字符串s,将它无限重复,求有几个前缀和为x的前缀(0则+1,1则-1)
进行+1,-1的操作,最后的值肯定是从最小的值一个个过渡到最大的值
1.题中给出:无限个则为-1,前提肯定是能满足x的,那么即整个串为0,串的前缀又符合为x。
2.满足x的:即x=num*()+Min~Max。
3.否则不满足x,即为0。
注意:空前缀只有在x=0时才有贡献
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
#define ll long long
ll sum[1000010];
signed main()
{
int T; cin>>T;
while(T--){
map<ll,ll>mp;
ll n,x; cin>>n>>x;
string s; cin>>s;
ll num=0,Max=0,Min=n;
for(ll i=0;i<n;i++){
if(s[i]=='0') num++;
else num--;
Max=max(Max,num);
Min=min(Min,num);
mp[num]++;
}
ll ans=0;
int flag=0,fla=0;
for(ll i=Min;i<=Max;i++){
if(i==x){
flag=1;
break;
}
}
if(num==0){
if(flag==1) ans=-1;
else{
ans=0;
flag=1;
}
}
else{
if(x==0){
ans=1;
fla=1;
}
// if(Min<=x&&x<=Max){
// ans+=mp[x];
// fla=1;
// }
// else{
for(ll i=Min;i<=Max;i++){
if((x-i)*num>=0&&(x-i)%num==0){
ans+=mp[i];
fla=1;
// cout<<i<<" ";
}
}
// }
}
if(flag==0&&fla==0) ans=0;
cout<<ans<<endl;
}
}