最后一个样例没过,思路就是直接更新最前面的位置,也就是之前的出现过的后面一个,然后DP统计
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1.5e7+10,P=998244353;
char s[N];
int n,dp[N],tmp[N];
int *Sum=tmp+5;
int frm[70];
main(){
scanf("%s",s+1);
n=strlen(s+1);
for(int i=1;i<=n;++i) s[i]-='0';
dp[0]=Sum[0]=1;
int pos=1;
for(int i=1;i<=n;++i){
int sum=s[i];
for(int j=i-1;j>=pos;--j){
sum+=s[j];
pos=max(pos,frm[sum]+1);
frm[sum]=j;
}
dp[i]=(Sum[i-1]-Sum[pos-2]+P)%P;
Sum[i]=(Sum[i-1]+dp[i])%P;
}
cout<<dp[n]<<'\n';
}