結果
問題 | No.1609 String Division Machine |
ユーザー |
👑 |
提出日時 | 2021-07-16 22:29:05 |
言語 | C (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 6 ms / 2,000 ms |
コード長 | 819 bytes |
コンパイル時間 | 121 ms |
コンパイル使用メモリ | 29,824 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-06 09:55:42 |
合計ジャッジ時間 | 1,160 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 37 |
ソースコード
#include <stdio.h> int main() { char S[100001]; scanf("%s", S); int i, j, k, dp[27], l, r, m; for (i = 0, dp[0] = 0, k = 0; S[i] != 0; i++) { if (S[i] == '?') continue; l = 0; r = k + 1; while (l < r) { m = (l + r) / 2; if (dp[m] < S[i] - 'a' + 1) l = m + 1; else r = m; } dp[l] = S[i] - 'a' + 1; if (l > k) k++; } if (k == 0) { for (i = 0; S[i] != 0; i++) printf("a"); printf("\n"); fflush(stdout); return 0; } for (i--, dp[0] = 30, j = 0; i >= 0; i--) { if (S[i] == '?') { if (j < k) S[i] = 'a'; else S[i] = 'a' + dp[j] - 1; } else { l = 0; r = j + 1; while (l < r) { m = (l + r) / 2; if (dp[m] > S[i] - 'a' + 1) l = m + 1; else r = m; } dp[l] = S[i] - 'a' + 1; if (l > j) j++; } } printf("%s\n", S); fflush(stdout); return 0; }