fork download
  1. // thứ tự từ điển:
  2. // so sánh thứ tự từ điển 2 xâu a, b
  3. // - xâu a có thứ tự từ điển < xâu b nếu thoả 1 trong 2 điều kiện sau:
  4. // + xâu a là tiền tố của xâu b
  5. // + tồn tại một vị trí i nào đó từ trái qua phải mà các kí tự i' < i, a[i'] = b[i'], còn kí tự a[i] < b[i]
  6. // Ví dụ:
  7. // abc < abcde
  8.  
  9. // aa < abc
  10.  
  11. // caaaaaaa > bcccccc
  12.  
  13. // badc < baddakldsjfsakjfslj
  14.  
  15.  
  16. // aaabb < aabbb
  17.  
  18. // aaa < aaaaa
  19.  
  20. // s = radar
  21. // các xâu con là xâu đối xứng:
  22. // rr
  23.  
  24. // raar
  25.  
  26. // ada
  27.  
  28. // aa
  29.  
  30. // radar
  31.  
  32.  
  33. // thứ tự từ điển nhỏ nhất: a
  34.  
  35. // cho xâu s có độ dài là n, thì nếu duyệt qua hết tất cả các xâu con của s thì độ phức tạp là bao nhiêu?
  36. // O(2^n)
  37.  
  38. #include <bits/stdc++.h>
  39. using namespace std;
  40.  
  41. int n;
  42. string s, ans;
  43.  
  44. bool isPalindrome(string t) {
  45. int m = t.size();
  46. for (int i = 0; i * 2 < m; i++) {
  47. if (t[i] != t[m - i - 1]) return false;
  48. }
  49. return true;
  50. }
  51.  
  52. void backtrack(int i, string t) {
  53. if (i == n) {
  54. if (isPalindrome(t)) ans = max(ans, t); // if (ans < t) ans = t;
  55. return;
  56. }
  57.  
  58. // không chọn s[i]
  59. backtrack(i + 1, t);
  60.  
  61. // chọn s[i]
  62. backtrack(i + 1, t + s[i]);
  63. }
  64.  
  65. int main() {
  66. cin >> s;
  67. n = s.size();
  68.  
  69. // khởi tạo ans = xâu có thứ tự từ điển nhỏ nhất (vì mình đang tìm max) (cũng có nhiều cách cài đặt khác)
  70. ans = "a";
  71. backtrack(0, "");
  72. cout << ans << '\n';
  73. }
Success #stdin #stdout 0.01s 5304KB
stdin
bowwowwow
stdout
wwwww