举个例子:
dp[3][i],代表枚举到第i位时,有多少个“nun”为前缀的组合,
dp[3][i]=dp[3][i-1] (继承上一位)+ dp[2][i-1]*(s[i]=='n'),如果s[i]是n,还要加上“nu”的个数。
然后需要注意dp[9][i]=dp[8][i-1]*(s[i]=='h'),不需要加上之前的dp[8][i-1]了,只需要考虑这个“nunhehheh”即可,代码如下:
#include <iostream>
#define ll long long
using namespace std;
const int MAXN = 100005, mod = 998244353;
int fix[MAXN];
ll dp[10][MAXN];
ll Pow(ll a, ll k){
ll ans = 1;
while(k){
if(k&1) ans=ans*a%mod;
a=a*a%mod;
k>>=1;
}
return ans-1; //返回2^k-1
}
int main(){
int T; cin>>T;
while(T--){
string s; cin>>s;
s='#'+s;
ll ans = 0;
int n = s.size();
fix[n+1]=0;
for(int i=n; i>=0; i--) fix[i]=(fix[i+1]+(s[i]=='a'))%mod;
for(int i=1; i<n; i++){
dp[1][i]=(dp[1][i-1]+(s[i]=='n'))%mod;
dp[2][i]=(dp[2][i-1]+dp[1][i-1]*(s[i]=='u'))%mod;
dp[3][i]=(dp[3][i-1]+dp[2][i-1]*(s[i]=='n'))%mod;
dp[4][i]=(dp[4][i-1]+dp[3][i-1]*(s[i]=='h'))%mod;
dp[5][i]=(dp[5][i-1]+dp[4][i-1]*(s[i]=='e'))%mod;
dp[6][i]=(dp[6][i-1]+dp[5][i-1]*(s[i]=='h'))%mod;
dp[7][i]=(dp[7][i-1]+dp[6][i-1]*(s[i]=='h'))%mod;
dp[8][i]=(dp[8][i-1]+dp[7][i-1]*(s[i]=='e'))%mod;
dp[9][i]=(dp[8][i-1]*(s[i]=='h'))%mod;
if(dp[9][i]){
ans = (ans + dp[9][i]*Pow(2, fix[i+1])%mod)%mod;
}
}
cout<<ans<<"\n";
}
return 0;
}