一つ目の答え
なる全ての について が kammyu に一致するかを判定すればよいです。
適切に実装することで で解くことができます。
二つ目の答え
の 文字目までの文字列 に部分列として現れる kammyu の 文字目までの個数
とします。つまり、
- の 文字目までの文字列 に部分列として現れる
kの個数 - の 文字目までの文字列 に部分列として現れる
kaの個数 - の 文字目までの文字列 に部分列として現れる
kamの個数 - の 文字目までの文字列 に部分列として現れる
kammの個数 - の 文字目までの文字列 に部分列として現れる
kammyの個数 - の 文字目までの文字列 に部分列として現れる
kammyuの個数
です。
ここで、求めたい答えは です。
は 文字目までに存在する k の個数と同じです。
は と と から求めることができます。
(実装例では、補助として空文字列の個数 を導入しています。)
(そして、 の昇順に求めており、実装例の中での dp[j] は本解説では と対応します。)
以上を適切に実装することで で解くことができます。
実装例(C++)
#include <bits/stdc++.h>
using namespace std;
int main()
{
string S;
cin >> S;
string kammyu = "kammyu";
int ans1 = 0;
for (int i = 0; i < S.length() - 5; i++)
{
bool f = true;
for (int j = 0; j < 6; j++)
f &= S[i + j] == kammyu[j];
ans1 += f;
}
cout << ans1 << endl;
int dp[7] = {1};
for (char c : S)
{
for (int j = 6; j > 0; j--)
if (c == kammyu[j - 1])
dp[j] = (dp[j] + dp[j - 1]) % 998244353;
}
cout << dp[6] << endl;
}
ユーザー解説
ユーザー解説を書くユーザー解説はまだありません。