题解 | 串

https://www.nowcoder.com/practice/01c35f01fb7343fe9fc16139562f78ed

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

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

发现总共的状态只有  个,记忆化搜索一下即可,每个状态最多只会遍历一次。

ps:我本地  爆栈了,交上去居然过了,非常神奇。

时间复杂度 

#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;
}

#牛客春招刷题训练营#
全部评论

相关推荐

在考古的丘比特很冷艳:[牛泪我横向一周多自动挂了,面试答的还行,感觉挂的莫名其妙
点赞 评论 收藏
分享
狄文君:多段项目经历 + 专业技能拉满,这简历很能打,坐等好消息!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务