传送门
题目:
Sample Input
2
nunhehhehahaahahahahahahaahaahahahahha
nunhehhehhehhahaahahahaahaahahaaaahaa
Sample Output
114514
1919810
大致翻译:
简略题意:寻找前缀为
n
u
n
h
e
h
h
e
h
nunhehheh
nunhehheh,后面至少有一个
a
a
a的字串,问有多少种组合情况;
根据枚举推到可以发现
a
a
a的组合情况:
当
a
a
a有
1
1
1个时,组合:
1
1
1种;
当
a
a
a有
2
2
2个时,组合:
3
3
3种;
当
a
a
a有
3
3
3个时,组合:
7
7
7种;
当
a
a
a有
4
4
4个时,组合:
15
15
15种;
当
a
a
a有
5
5
5个时,组合:
31
31
31种;
…
…
……
……
得到公式: 当
a
a
a有
n
n
n个时组合有
2
n
−
1
2^n-1
2n−1种;
然后就是
d
p
dp
dp了
…
…
……
……
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
const int mod=998244353;
//const double eps=1e-8;
#define eps 1e-8
int a[N],dp[10][N],c[N];
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;cin>>t;
c[0]=1;
for(int i=1;i<=1e5;i++)c[i]=(c[i-1]*2)%mod;
while(t--){
string s;cin>>s;
s=' '+s;
int len=s.size();
a[len+1]=0;
for(int i=len;i;i--)a[i]=a[i+1]+(s[i]=='a');
ll ans=0;
for(int i=1;i<len;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%mod+dp[9][i]*(1ll*(c[a[i+1]]-1+mod)%mod)%mod)%mod;//注意不能漏1ll
}
cout<<ans<<endl;
}
return 0;
}