難易度評価

難易度を1〜10段階で評価できます。投票はあとから変更・取り消しできます。

難易度(投票) 未投票 (0票)

投票の分布

まだ投票はありません。

  1. Lv.10票
  2. Lv.20票
  3. Lv.30票
  4. Lv.40票
  5. Lv.50票
  6. Lv.60票
  7. Lv.70票
  8. Lv.80票
  9. Lv.90票
  10. Lv.100票

難易度の目安を見る ↗

ログインして難易度を投票

外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

Find Kammyu

作成者 kammyu

難易度(作成者設定) Lv.3

難易度(投票) 未投票 (0票)

実行時間制限
2 秒
メモリ制限
512 MiB

一つ目の答え

1≤i≤∣S∣−51\le i\le|S|-5 なる全ての ii について SiSi+1Si+2Si+3Si+4Si+5S_iS_{i+1}S_{i+2}S_{i+3}S_{i+4}S_{i+5} が kammyu に一致するかを判定すればよいです。
適切に実装することで O(N)O(N) で解くことができます。

二つ目の答え

dp[i][j]=Sdp[i][j]=S の ii 文字目までの文字列 S1S2⋯Si−1SiS_1S_2\cdots S_{i-1}S_i に部分列として現れる kammyu の jj 文字目までの個数

とします。つまり、

  • dp[i][1]=Sdp[i][1]=S の ii 文字目までの文字列 S1S2⋯Si−1SiS_1S_2\cdots S_{i-1}S_i に部分列として現れる k の個数
  • dp[i][2]=Sdp[i][2]=S の ii 文字目までの文字列 S1S2⋯Si−1SiS_1S_2\cdots S_{i-1}S_i に部分列として現れる ka の個数
  • dp[i][3]=Sdp[i][3]=S の ii 文字目までの文字列 S1S2⋯Si−1SiS_1S_2\cdots S_{i-1}S_i に部分列として現れる kam の個数
  • dp[i][4]=Sdp[i][4]=S の ii 文字目までの文字列 S1S2⋯Si−1SiS_1S_2\cdots S_{i-1}S_i に部分列として現れる kamm の個数
  • dp[i][5]=Sdp[i][5]=S の ii 文字目までの文字列 S1S2⋯Si−1SiS_1S_2\cdots S_{i-1}S_i に部分列として現れる kammy の個数
  • dp[i][6]=Sdp[i][6]=S の ii 文字目までの文字列 S1S2⋯Si−1SiS_1S_2\cdots S_{i-1}S_i に部分列として現れる kammyu の個数

です。
ここで、求めたい答えは dp[N][6]dp[N][6] です。

dp[i][1]dp[i][1] は ii 文字目までに存在する k の個数と同じです。
dp[i][j]dp[i][j] は SjS_j と dp[i−1][j]dp[i-1][j] と dp[i][j−1]dp[i][j-1] から求めることができます。

(実装例では、補助として空文字列の個数 dp[0][0]=dp[1][0]=⋯=dp[N][0]=1dp[0][0]=dp[1][0]=\dots=dp[N][0]=1 を導入しています。)
(そして、ii の昇順に求めており、実装例の中での dp[j] は本解説では dp[i][j]dp[i][j] と対応します。)

以上を適切に実装することで O(N)O(N) で解くことができます。

実装例(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;
}

ユーザー解説

ユーザー解説を書く

ユーザー解説はまだありません。