Description

求长度不超过 ,且包含子序列""的、只由小写字母构成的字符串有多少个?

Solution

不妨令 表示枚举到第 个位置的时候状态为

  • 其中, 状态是当前是否已满足条件——已出现""的子序列
  • 状态是当前是否已经出现了字母

发现总共的状态只有 个,记忆化搜索一下即可,每个状态最多只会遍历一次。
ps:我本地 爆栈了,交上去居然过了,非常神奇。
时间复杂度

Code

#include <bits/stdc++.h>
#pragma GCC optimize(3)
#pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long ll;
using namespace std;

const int N = 1e6 + 5;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
ll dp[N][2][2];
ll dfs(int pos, bool state, bool lead) {
  if(pos == -1) {
    return state;
  }
  if(dp[pos][state][lead] != -1) return dp[pos][state][lead];
  ll ans = 0;
  for(int i = 0; i < 26; i++) {
    char now = i + 'a';
    ans += dfs(pos - 1, state || (lead && now == 's'), lead || now == 'u') % mod;
  }
  return dp[pos][state][lead] = ans;
}

void solve() {
  int n; cin >> n;
  memset(dp, -1, sizeof(dp));
  ll ans = 0;
  for (int i = n; i >= 2; i--) {
      ans += dfs(i - 1, 0, 0);
      ans %= mod;
  }
  cout << ans << '\n';
}
int main() {
  ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  int T = 1; //cin >> T;
  while(T--) {
    solve();
  }
  return 0;
}