#include<bits/stdc++.h>usingnamespace std;constint maxn =5e5+20;int p[maxn];
set<int> v;intmain(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);int n, k;
cin >> n >> k;for(int i =0; i < n; i++){
cin >> p[i];}//先得到前面的sort(p, p + k);for(int i =0; i < k; i++){
v.insert(p[i]);}int ans = p[0];
cout << ans << endl;for(int i = k; i < n; i++){if(p[i]> ans){
v.insert(p[i]);
ans =*v.upper_bound(ans);
cout << ans << endl;}else
cout << ans << endl;}return0;}
d
p
i
,
j
dp_{i,j}
dpi,j指的是用到了前i个字符(这个”个“指的是26个小写字母的前几个),构成的长度为j的字符串的数量,所以我们答案肯定就是
∑
i
=
1
s
.
l
e
n
g
t
h
(
)
d
p
26
,
i
\sum_{i = 1}^{s.length()}{dp_{26,i}}
∑i=1s.length()dp26,i
那么对于
d
p
i
,
j
dp_{i,j}
dpi,j我们怎么得到呢?首先我们可以通过少用一种字母即
d
p
i
−
1
,
j
dp_{i - 1,j}
dpi−1,j,也可以少用前面已经构成好的串里删去某个字符换上当前第i个字符(第i种),这样的话就是
d
p
i
−
1
,
j
−
1
×
C
j
1
dp_{i - 1,j - 1}\times C_j^1
dpi−1,j−1×Cj1,依次类推,可以删去1,2…min(cnt[i],j)个字符也就是说最后
d
p
i
,
j
dp_{i,j}
dpi,j =
∑
k
=
0
m
i
n
(
j
,
c
n
t
[
i
]
)
d
p
i
−
1
,
j
−
k
×
C
j
k
\sum_{k = 0}^{min(j,cnt[i])}{dp_{i - 1,j - k}}\times C_j^k
∑k=0min(j,cnt[i])dpi−1,j−k×Cjk
综上即可得出答案
代码如下:
#include<bits/stdc++.h>#defineintlonglongusingnamespace std;constint MAX =5010, mod =998244353;
vector<int> fac, finv, inv;int cnt[26];int dp[27][MAX];voidinit(){
fac.resize(MAX);
finv.resize(MAX);
inv.resize(MAX);
fac[0]= fac[1]=1;
inv[1]=1;
finv[0]= finv[1]=1;for(int i =2; i < MAX; i++){
fac[i]= fac[i -1]* i % mod;
inv[i]= mod - mod / i * inv[mod % i]% mod;
finv[i]= finv[i -1]* inv[i]% mod;}}intc(int n,int m){return fac[n]* finv[m]% mod * finv[n - m]% mod;}// c(n,m)signedmain(){init();
string s;
cin >> s;int n = s.length();for(int i =0; i < n; i++){
cnt[s[i]-'a']++;//统计一下每个字母的数量}
dp[0][0]=1;for(int i =0; i <26; i++){for(int j =0; j <= n; j++){for(int k =0; k <=min(j, cnt[i]); k++){
dp[i +1][j]+= dp[i][j - k]*c(j, k);
dp[i +1][j]%= mod;}}}int ans =0;for(int i =1; i <= n; i++){
ans =(ans + dp[26][i])% mod;}
cout << ans << endl;return0;}