Bảng mã Ascii (HSG '18)

Xem PDF

Điểm: 100 (p) Thời gian: 1.0s Bộ nhớ: 256M Input: bàn phím Output: màn hình

Trong bảng mã ASCII, \(26\) kí tự chữ cái thường từ ‘a’ đến ‘z’ được mã hóa tương ứng bằng các số tự nhiên từ \(97\) đến \(122\).

Cho một xâu kí tự \(S\) chỉ chứa toàn các kí tự chữ cái thường. Gọi \(P\) là xâu mã hóa tương ứng của xâu \(S\) bằng cách mã hóa từng ký tự trong \(S\) (theo bảng mã ASCII) và viết liên tiếp nhau. Ví dụ: \(S\) = ‘ab’ thì \(P\) = ‘9798’.

Hãy viết chương trình nhập vào từ bàn phím một xâu đã mã hóa \(P\) và in ra màn hình xâu kí tự \(S\).

Input

  • Một xâu đã mã hóa \(P\).

Output

  • In ra màn hình xâu ký tự \(S\).

Constraints

  • \(1 \leq P.size() \leq 255\)

Example

Test 2

Input
979899 
Output
abc

Test 3

Input
1009711097110103 
Output
danang

Bình luận


  • -1
    thanhyl7a20    3:37 p.m. 12 Tháng 10, 2021

    long long i,kq;
    string s;
    cin >>s;
    i=0;
    kq=0;
    while(i<s.size()){ kq=kq*10+(s[i]-48); if(kq>=97 && kq<=122){
    cout<<(char) kq;
    kq=0;
    }
    i=i+1;
    }


    • 0
      thanhyl7a20    3:34 p.m. 12 Tháng 10, 2021

      Hint 1 <Cài đặt>
      Nhận thấy các chữ cái kết quả xuất ra được là phân biệt và không liên quan nhau (nghĩa là mình xuất một đoạn chữ số có giá trị là một kí tự thì những kí tự còn lại không bị ảnh hưởng và luôn có cách để xuất ra)

      Nên ta sẽ thử từng xâu có độ dài 2 và 3 và xuất ra nếu được

      Approach 1 <Cài đặt>
      Gọi toDec(c) là hàm biến kí tự c thành chữ số

      Gọi hàm inRange(x,l,r) kiểm tra xem x∈[l,r] đúng hay sai

      Ta tính v2 là giá trị của 2 kí tự xét từ vị trí i xem nó thuộc đoạn 97..99 thì xuất ra và di chuyển con trỏ sang 2 ô

      Ta tính v3 là giá trị của 3 kí tự xét từ vị trí i xem nó thuộc đoạn 100..122 thì xuất ra và di chuyển con trỏ sang 3 ô

      Code tham khảo<Accepted> : Cài đặt
      Complexity : O(|s|) time || O(|s|) memory
      Copy
      int toDec(char c) { return c - '0'; }
      bool inRange(int x, int l, int r) { return (l <= x) && (x <= r); }
      int main()
      {
      string s;
      cin >> s;

      for (int i = 0; i < s.size(); )
      {
          int v2 = toDec(s[i + 0]) * 10 + toDec(s[i + 1]) * 1;
          if (inRange(v2, 97, 99))
          {
              cout << char(v2);
              i += 2;
          }
      
          int v3 = toDec(s[i + 0]) * 100 + toDec(s[i + 1]) * 10 + toDec(s[i + 2]) * 1;
          if (inRange(v3, 100, 122))
          {
              cout << char(v3);
              i += 3;
          }
      }
      
      return 0;
      

      }
      Hint 2 <Tối ưu không gian>::<Giải trực tiếp>
      Dù có thể không cần thiết lắm và cải thiện được nhiều nhưng có tồn tại thuật toán giải trực tiếp bài này với việc nhận từng kí tự 1
      Trong C++ đó là lệnh std::getchar
      Approach 2 <Tối ưu không gian>::<Giải trực tiếp>
      Gọi t là mã ASCII của kí tự hiện tại, nếu t∈[′a′,′z′] thì xuất, không thì khởi tạo nó về 0 để tính tiếp
      Công thức tnow=10∗tpre+(c−′0′)
      Gọi c là kí tự hiện tại [′0′..′9′], chuyển nó về dạng số và chèn nó về bên phải t, nếu nó không phải là chữ số thì nó không thuộc xâu S nữa nên ta sẽ dừng vòng lặp
      Code tham khảo<Accepted> : Giải trực tiếp
      Complexity : O(|s|) time || O(1) memory
      Copy
      inline bool isDigit(char c) { return '0' <= c && c <= '9'; }
      inline bool isLowerLatin(char c) { return 'a' <= c && c <= 'z'; }
      int main()
      {
      int t = 0; // khoi tao
      while (true) {
      char c = getchar();
      if (isDigit(c) == false) break; /// neu ki tu hien tai khong thuoc xau S

         t = 10 * t + (c - '0');
         if (isLowerLatin(t)) /// kiem tra
         {
             cout << t;
             t = 0; /// khoi tao
         }
      

      }

      return 0;
      }

      2 phản hồi

      • -4
        thanhyl7a20    3:34 p.m. 12 Tháng 10, 2021

        lmao


        • -24
          huy123    6:34 p.m. 18 Tháng 3, 2021

          Bình luận bị ẩn vì nhiều phản hồi tiêu cực. Nhấp vào đây để mở.


          • -14
            nguyenquochuy    6:14 p.m. 29 Tháng 8, 2020

            Bình luận bị ẩn vì nhiều phản hồi tiêu cực. Nhấp vào đây để mở.

            1 phản hồi