1606A - AB Balance(構造性演算法+字串+級)
阿新 • • 發佈:2021-10-30
2021.10.29CF Round #750 (Div. 2),2021.10.30補題
1606A - AB Balance(源地址自⇔CF1606A)
Problem
tag:
⇔構造性演算法、⇔字串、⇔級(*)
題意:
對於給定的只包含 \(a\) 和 \(b\) 的字串,請你通過最少的修改次數,使得新的字串中 \(ab\) 和 \(ba\) 的子串數量相同。輸出這個新的子串
思路:
顯然的,連續的 \(a\) 和連續的 \(b\) 交界處才有一次 \(ab\) ,連續的 \(b\) 和連續的 \(a\) 交界處才有一次 \(ba\) 。所以只要給定的字串有偶數個交界,即符合題意。所以對於奇數個交界的字串,只需要修改開始元素即可(使得交界變成偶數個)。可以證明,這種方法恆為最優的。
(附錯誤思路:如給定的字串有奇數個交界,則去尋找字串中最短的連續 \(a\) 或連續 \(b\) ,並修改這一整段。可以證明,這種方法不是最優的。)
AC程式碼:
//A WIDA Project #include <bits/stdc++.h> using namespace std; long long T, num; string s; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> T; while(T -- > 0) { num = 0; cin >> s; for(int i = 1; i < (int)s.size(); i ++) { if(s[i] != s[i - 1]) { num ++; } } if(num % 2 == 1) s[0] == 'a'? s[0] = 'b': s[0] = 'a'; cout << s << endl; } return 0; }
錯誤次數:4次
原因:思路完全錯誤(錯誤思路見上)。
文 / WIDA
2021.10.30成文
首發於WIDA個人部落格,僅供學習討論
更新日記:
2021.10.30 成文