Educational Codeforces Round 81 (Rated for Div. 2)B. Infinite Prefixes

B. Infinite Prefixes

题目链接-Infinite Prefixes
在这里插入图片描述
在这里插入图片描述
题目大意
就是给一个长度已知可以无限重复的字符串s,只有0和1两种字符,定义一个字符串的q值为’0’字符的个数减去’1’字符的个数,问给定字符串s的所有前缀中(包括空字符串)q值为x的个数
解题思路
把0看成是1,把1看成是-1,求个前缀和
我们以0的个数减去1的个数为y轴,串的循环长度建立坐标系,可以发现题意就化成是求一个一阶导数为存在周期的函数经过多少次零点问题
当s的q值不为0的时候:
一个周期的q值增量pre[n]
​一个周期中到第i个字符的前缀q值为pre[i],
​当满足(x−pre[i])%pre[n]==0且 (x-pre[i])/pre[n]>=0
注意特判一下x=0空串的情况:
​如果s的所有前缀中有出现q值为x的时候,输出-1,否则答案为0

附上代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF=0x3f3f3f;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	
	int t;
	cin>>t;
	while(t--){
		bool flag=1;
		int n,x,ans=0,num=0;
		cin>>n>>x;
		string s;
		cin>>s;
		if(x==0)
			ans++; 
		for(int i=0;i<n;i++){
			if(s[i]=='0')
				num++;
			else
				num--;
		}
		int now=0;
		for(int i=0;i<n;i++){
			if(s[i]=='0')
				now++;
			else
				now--;
			int z=x-now;
			if(z==0&&num==0){
				cout<<"-1"<<endl;
				flag=0;
				break;
			}
			if(num!=0&&abs(z)%abs(num)==0&&z/num>=0)
				ans++;
		}
		if(flag)
			cout<<ans<<endl;
	}
	return 0;
}
发布了23 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Fiveneves/article/details/104118309