求助 ABC E
  • 板块学术版
  • 楼主mystic_qwq
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/10/1 21:18
  • 上次更新2024/10/2 09:01:57
查看原帖
求助 ABC E
246331
mystic_qwq楼主2024/10/1 21:18

最后一个样例没过,思路就是直接更新最前面的位置,也就是之前的出现过的后面一个,然后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;
  }
  //for(int i=1;i<=n;++i)
    //cout<<dp[i]<<" \n"[i==n];
  cout<<dp[n]<<'\n';
}

2024/10/1 21:18
加载中...