列表

详情


NC227315. 又一数区间问题

描述

牛牛最近沉迷各种数区间问题,例如多少个区间和等于给定值,多少个区间异或和等于给定值,多少个区间是回文的,多少个区间可以送给牛妹做礼物等等。

现在,请你帮牛牛再解决一个数区间问题:

给定一个长为的数字串(只包含的整数),求有多少个区间满足区间长度等于区间内所有数字的积。

输入描述

第一行输入一个整数,数字串的长度。

第二行给出该数字串,保证之中只含有的数字。

输出描述

输出一个整数,表示满足条件的区间个数。

示例1

输入:

3
121

输出:

4

说明:

四个区间为

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 7ms, 内存消耗: 1108K, 提交时间: 2021-10-03 18:57:59

#include<stdio.h>
#define ll long long
char s[100005];
ll next[100005];
int main()
{
	ll i,j,k,l,n,m,sum=0,p=0;
	scanf("%lld",&n);
	scanf("%s",s+1);
	for(i=1;i<=n;i++)if(s[i]!='1')next[++p]=i;j=1;next[++p]=n+1;
	for(i=1;i<=n;i++){//枚举开头 
	k=s[i]-'0';
	if(i>=next[j])j++;m=0;
		for(l=j;l<=p&&k<=n;l++){
			if(next[l]-i>=k&&k>=m)sum++;
			k*=(s[next[l]]-'0');
			m=next[l]-i+1;
		}
	}
	printf("%lld",sum);
	
}

C++ 解法, 执行用时: 7ms, 内存消耗: 896K, 提交时间: 2021-09-05 19:11:18

#include<bits/stdc++.h>
using namespace std;

char R[100005];
int nxt[100005];
int main()
{
	int i,j,n,s,ans=0;
	scanf("%d%s",&n,R+1);
	j=n+1;
	for(i=n;i>=1;i--)
	{
		nxt[i]=j;
		if(R[i]!='1')j=i;
	}
	for(i=1;i<=n;i++)
	{
		s=R[i]-'0',j=i;
		while(j<=n&&s<=n-i+1)
		{
			if(s<=nxt[j]-i&&s>=j-i+1)ans++;
			j=nxt[j],s*=R[j]-'0';
		}
	}
	printf("%d\n",ans);
	return 0;
}

上一题