让 dp [ i ] [ j ]是“从 S 的前 i 个字符中选择的 j 个字符的组合数,以便结果字符串等于 chokudai 的前 j 个字符。时间复杂度O(N)
#include <bits/stdc++.h>
using namespace std;
#define mem(a, b) memset(a, b, sizeof(a))
#define ll long long int
#define endl '\n'
typedef pair<int, int> PII;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 7;
int dp[N][10];
signed main() {
char s[N];
cin >> s + 1;
int n = strlen(s + 1);
string p = "@chokudai";
for (int i = 0; i <= n; i++)
dp[i][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 8; j++) {
if (s[i] == p[j])
dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1]) % mod;
else
dp[i][j] = (dp[i - 1][j]) % mod;
}
}
cout << dp[n][8] << endl;
return 0;
}
/*
*
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████+
* ◥██◤ ◥██◤ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃ + + + +Code is far away from
* ┃ ┃ + bug with the animal protecting
* ┃ ┗━━━┓ 神兽保佑,代码无bug
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/