生活随笔
收集整理的這篇文章主要介紹了
Nun Heh Heh Aaaaaaaaaaa 字符串,dp
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意 :
- 給一字符串,求其有多少個(gè)子序列為𝚗𝚞𝚗𝚑𝚎𝚑𝚑𝚎𝚑加上若干個(gè)a(大于等于1),最后%998244353
思路 :
- 由非連續(xù)子序列聯(lián)想到dp
- 預(yù)處理,cnta數(shù)組代表第i個(gè)后面出現(xiàn)的字母a的個(gè)數(shù)
- 對(duì)于第i個(gè)后面的所有的a每一個(gè)選與不選一共有2n2^n2n種情況,因?yàn)椴荒苁强占?#xff0c;所以是2n?12^n-12n?1種情況
- f[i,j]f[i, j]f[i,j]表示前i個(gè)字符中以numhehheh中第j個(gè)結(jié)尾的個(gè)數(shù)
- 將它們相乘就是位置i的貢獻(xiàn),再?gòu)那巴蟊闅v相加每一個(gè)點(diǎn)的貢獻(xiàn)就是總的方案數(shù)
#include <iostream>
#include <cstring>using namespace std
;typedef long long ll
;const ll mod
= 998244353;
const int N
= 1e5 + 10;ll cnta
[N
], f
[N
][10];ll
qmi(ll a
, ll b
, ll p
)
{ll res
= 1 % p
;while (b
){if (b
& 1) res
= res
* a
% p
;a
= a
* (ll
)a
% p
;b
>>= 1;}return res
;
}int main()
{int T
;cin
>> T
;while (T
-- ){string s
;cin
>> s
;s
= " " + s
;memset(f
, 0, sizeof f
);memset(cnta
, 0, sizeof cnta
);for (int i
= s
.size(); i
; i
-- ) cnta
[i
] = cnta
[i
+ 1] + (s
[i
] == 'a');ll res
= 0;for (int i
= 1; i
<= s
.size(); i
++ ){f
[i
][1] = (f
[i
- 1][1] + (s
[i
] == 'n')) % mod
;f
[i
][2] = (f
[i
- 1][2] + f
[i
- 1][1] * (s
[i
] == 'u')) % mod
;f
[i
][3] = (f
[i
- 1][3] + f
[i
- 1][2] * (s
[i
] == 'n')) % mod
;f
[i
][4] = (f
[i
- 1][4] + f
[i
- 1][3] * (s
[i
] == 'h')) % mod
;f
[i
][5] = (f
[i
- 1][5] + f
[i
- 1][4] * (s
[i
] == 'e')) % mod
;f
[i
][6] = (f
[i
- 1][6] + f
[i
- 1][5] * (s
[i
] == 'h')) % mod
;f
[i
][7] = (f
[i
- 1][7] + f
[i
- 1][6] * (s
[i
] == 'h')) % mod
;f
[i
][8] = (f
[i
- 1][8] + f
[i
- 1][7] * (s
[i
] == 'e')) % mod
;f
[i
][9] = (f
[i
- 1][8] * (s
[i
] == 'h')) % mod
;if (f
[i
][9]) res
= (res
+ f
[i
][9] * (qmi(2, cnta
[i
+ 1], mod
) - 1) % mod
) % mod
;}cout
<< res
<< endl
;}return 0;
}
總結(jié)
以上是生活随笔為你收集整理的Nun Heh Heh Aaaaaaaaaaa 字符串,dp的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。