这什么垃圾数据一堆贪心的我随手就能卡掉。
我们考虑dp
先考虑有多少段叭,然后考虑每一段是不是0,
然后就得到递推式
如果当前串是0
dp[i][0]=dp[i-1][0]+dp[i-1][1],//我们把这个0拿出来,与前面所有的方案都形成一种新方案
dp[i][1]=dp[i-1][1];//直接拼上去
如果不是0
dp[i][0]=0;
dp[i][1]=dp[i-1][1]*2+dp[i-1][0];//对于dp[i-1][1]来说拼或者不拼,对于dp[i-1][0]来说只能不拼。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll mod = 998244353; int n;string s; bool ning[100005];int cnt=0; ll dp[100005][2]; int main(){ ios::sync_with_stdio(false); cin>>n>>s;s="*"+s; int tmp=0,len=0; for(int i=1;i<=n;i++){ tmp=(tmp+s[i]-'0')%3; len++; if(!tmp){ ning[++cnt]=(len==1&&s[i]=='0'); len=0; } } if(tmp)cout<<0<<endl; else{ dp[0][0]=1;dp[0][1]=0; for(int i=1;i<=cnt;i++){ if(ning[i]){ dp[i][1]=dp[i-1][1]; dp[i][0]=(dp[i-1][0]+dp[i-1][1])%mod; }else{ dp[i][0]=0; dp[i][1]=(dp[i-1][1]*2+dp[i-1][0])%mod; } } cout<<(dp[cnt][0]+dp[cnt][1])%mod; } }