题意:给一串数字,可以表示成多少个a(个数)个b(0~9)(内容);
思路:f[ i ]表示以i为末尾内容有多少种。f[ i ]=Σf[ j ](j=2~i-2)且s[ i ]!=s[ j ] && s[ j+1 ]!='0';前缀和,删掉不合法的。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cctype>
using namespace std;
const int maxn=1000006;
const int mod=998244353;
char s[maxn];
int n,f[maxn],sum=0,del[maxn];
int main(){
scanf("%s",s+1);
n=strlen(s+1);
memset(del,0,sizeof(del));
if(s[1]=='0'){printf("0\n");return 0;}
else{
sum=0;
for(int i=2;i<=n;++i){
s[i]-=48;
f[i]=(sum-del[s[i]]+1+mod)%mod;
if(s[i]!=0){
sum=(sum+f[i-1])%mod;
del[s[i-1]]=(del[s[i-1]]+f[i-1])%mod;
}
}
}
printf("%d\n",f[n]);
return 0;
}