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; }