結果
| 問題 |
No.2388 At Least K-Characters
|
| コンテスト | |
| ユーザー |
chro_96
|
| 提出日時 | 2023-07-21 22:54:38 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 63 ms / 4,000 ms |
| コード長 | 1,095 bytes |
| コンパイル時間 | 1,152 ms |
| コンパイル使用メモリ | 30,208 KB |
| 実行使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2024-07-05 03:54:39 |
| 合計ジャッジ時間 | 3,154 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 34 |
ソースコード
#include <stdio.h>
int main () {
int n = 0;
int m = 0;
int k = 0;
char s[500001] = "";
int res = 0;
long long ans = 0LL;
long long mod_num = 998244353LL;
long long cnt[26] = {};
long long work[26] = {};
int flag[26] = {};
int tmp = 0;
res = scanf("%d", &n);
res = scanf("%d", &m);
res = scanf("%d", &k);
res = scanf("%s", s);
for (int i = 0; i < m; i++) {
for (int j = 0; j < 26; j++) {
work[j] += cnt[j]*((long long)(j+1));
}
for (int j = 0; j < 25; j++) {
work[j+1] += cnt[j]*((long long)(25-j));
}
for (int j = 0; j < (int)(s[i]-'a'); j++) {
if (flag[j] > 0) {
work[tmp-1] += 1LL;
} else {
work[tmp] += 1LL;
}
}
for (int j = 0; j < 26; j++) {
cnt[j] = work[j]%mod_num;
work[j] = 0LL;
}
for (int j = k-1; j < 26; j++) {
ans += cnt[j];
}
if (flag[(int)(s[i]-'a')] <= 0) {
flag[(int)(s[i]-'a')] = 1;
tmp++;
}
if (tmp >= k && i < n-1) {
ans += 1LL;
}
}
printf("%lld\n", ans%mod_num);
return 0;
}
chro_96