質問: 'z') { cout << ans << endl; return 0; } } } cout << ans << endl; return 0; } ```
回答: 解決できました! 変化した部分のカウントをカウントアップからカウントダウンに変更して、 まだ決まってない部分の最小変化数をカウントする際にminを使って英字を総なめする方針で行くと全部通りました! 元のコードは、同じ文字が文字列に含まれている場合に、まだ決まってない部分の最小変化数をカウントするループ中でalphabetが持つ値を更新しなければならないことを見落としていたためにできなかった感じです!このやり方はいろんな変数の更新頻度が多くなり煩雑だったのでカウントダウンへ方針転換したところすっきりしました! 皆様ありがとうございました! ``` #include #include #include #include #include using namespace std; int main(void) { int N, K; cin >> N >> K; string s; cin >> s; map alphabet; for (char i = 'a'; i <= 'z'; i++) { alphabet[i] = 0; } for (int i = 0; i < N; i++) { alphabet[s[i]] += 1; } string ans = ""; for (int i = 0; i < N; i++) { for (char i = 'a'; i <= 'z'; i++) { if (alphabet[i]) { string tmp_ans = ans; map tmp_alphabet = alphabet; int changed_count = N; //ansとalphabetの内容を仮決め tmp_ans += i; tmp_alphabet[i]--; //すでに決まっている部分の変化数をカウント for (int j = 0; j < tmp_ans.size(); j++) { if (tmp_ans[j] == s[j]) { changed_count--; } } //まだ決まってない部分の最小変化数をカウント for (char k = 'a'; k <= 'z'; k++) { changed_count -= min(count(s.begin() + tmp_ans.size(),s.end(),k),tmp_alphabet[k]); } //変化量がK以下なら仮決めしていたansとalphabetを確定する if (changed_count <= K) { ans = tmp_ans; alphabet = tmp_alphabet; break; } } //zまでたどり着いても確定できなかった場合は終了 if (i == 'z') { cout << ans << endl; return 0; } } } cout << ans << endl; return 0; } ```