Nhân dịp tổng kết năm học, câu lạc bộ Tin học của bạn Nam tổ chức chuyến tham quan dã ngoại tại một khu du lịch trên địa bàn huyện X. Trải nghiệm đầu tiên của các bạn là trò chơi "Tìm kho báu", Để tìm ra kho báu các bạn cần phải có mật mà là một dây 5 gồm các chữ cái in thiường. Mật mã này đã được mà hóa thành dây T theo quy tắc sau:
Chọn trước 1 ký tự ch và tiến hành loại bỏ tất cả các ký tự ch trong dây 5 thu được dây mới là K.
Nối dãy K vào sau dãy S thu được dãy T.
Các thành viên câu lạc bộ được Ban tổ chức cung cấp dây T và một ký tự ch. Nhiệm vụ của các thành viên là giải mã để tìm dãy S.
Yêu cầu: Tìm dây S từ dãy T đã cho.
Input:
Dòng thứ nhất ghi dây T có độ dài L. (2 < L < 10^16).
Dòng thứ hai ghi một ký tự ch
Output: ghi một dòng là dãy S nếu tìm được mật mã, ngược lại ghi -1 nếu không tìm được mật mã.
Ví dụ:
Input
abcab
c
Output
abc
Input
abcabcc
b
Ouput
-1
mn ai bt bai nay ko a
mik can code python gap ah
Quảng cáo
2 câu trả lời 160
Quy tắc mã hóa:
Cho chuỗi gốc S, thực hiện:
Loại bỏ tất cả ký tự ch khỏi S → được chuỗi K.
Ghép K vào sau S → T = S + K.
Bài toán yêu cầu:
Từ chuỗi T và ký tự ch, tìm lại chuỗi S. Nếu không tồn tại, in -1.
Ý tưởng giải:
Gọi độ dài T là L, gọi x là độ dài của chuỗi S.
Vì T = S + K, nên:
S có độ dài x
K có độ dài L - x
K = S sau khi loại bỏ hết ký tự ch.
Do đó:
Nếu tồn tại x sao cho:
python
Sao chépChỉnh sửa
K = T[x:] (tức phần sau S trong T)
và
K == S bỏ hết ký tự ch
→ thì S = T[:x] là chuỗi hợp lệ.
Thuật toán:
Duyệt x từ 1 đến L - 1:
S_candidate = T[:x]
K_candidate = T[x:]
Nếu S_candidate bỏ hết ký tự ch đi chính là K_candidate → in S_candidate
Nếu không tìm được, in -1
Cài đặt Python:
python
Sao chépChỉnh sửa
def giai_ma(T, ch):
L = len(T)
for x in range(1, L):
S = T[:x]
K = T[x:]
S_removed = S.replace(ch, "")
if S_removed == K:
return S
return "-1"
# Đọc input
T = input().strip()
ch = input().strip()
print(giai_ma(T, ch))
Ví dụ chạy:
Input:
r
Sao chépChỉnh sửa
abcab
c
Output:
nginx
Sao chépChỉnh sửa
abc
Input:
css
Sao chépChỉnh sửa
abcabcc
b
Output:
diff
Sao chépChỉnh sửa
-1
Để giải mã dãy \( S \) từ dãy \( T \) và ký tự \( ch \), bạn có thể làm theo các bước sau:
1. **Xác định dãy \( K \):** Dãy \( K \) được tạo ra bằng cách loại bỏ tất cả các ký tự \( ch \) khỏi dãy \( T \).
2. **Tách dãy \( T \):** Dãy \( T \) sẽ có dạng:
\[
T = S + K
\]
trong đó \( S \) là dãy ban đầu cần tìm, và \( K \) là dãy đã được loại bỏ ký tự \( ch \).
3. **Lấy dãy \( K \):**
- Bắt đầu từ dãy \( T \), bạn sẽ lặp qua từng ký tự.
- Nếu ký tự hiện tại không phải là \( ch \), thì nó thuộc về dãy \( K \).
- Nếu ký tự hiện tại là \( ch \), thì nó không thuộc về dãy \( K \) và bị loại bỏ.
4. **Tìm dãy \( S \):**
- Dãy \( S \) là phần đầu của dãy \( T \) trước khi bắt đầu dãy \( K \). Do đó, bạn chỉ cần giữ lại các ký tự trong \( T \) cho đến khi bắt đầu gặp ký tự \( ch \).
### Ví dụ minh hoạ:
Giả sử:
- Dãy \( T \) = "abcdeedcba"
- Ký tự \( ch \) = "c"
**Bước 1:** Xác định dãy \( K \)
- Bỏ đi tất cả ký tự "c" từ dãy \( T \):
Dãy \( K \) sẽ là "abdeedba".
**Bước 2:** Ta đã biết rằng:
\[
T = S + K
\]
**Bước 3:** Xác định chiều dài của \( K \):
- \( K \) có chiều dài 8 (là "abdeedba").
**Bước 4:** Tìm dãy \( S \):
- Kí tự cuối cùng mà không phải là \( ch \) ngay trước dãy \( K \) bắt đầu. Dãy \( S \) sẽ là phần đầu của \( T \) cho đến phong vị đầu tiên mà là \( c \).
Duyệt qua dãy \( T\):
- "a" không phải là "c" => giữ lại.
- "b" không phải là "c" => giữ lại.
- "c" là ký tự phải xóa => dừng lại.
Do đó, dãy \( S \) là "ab".
### Kết luận:
Dựa vào dãy \( T \) và ký tự \( ch \), bạn có thể Mã Hóa ngược để lấy lại dãy \( S \).
### Thuật toán:
1. Nhập vào dãy \( T \) và ký tự \( ch \).
2. Tạo một biến rỗng \( S \).
3. Duyệt qua từng ký tự trong \( T \):
- Nếu ký tự không phải là \( ch \), thêm vào \( S \).
- Nếu ký tự là \( ch \), dừng lại.
4. Xuất dãy \( S \).
Lưu ý rằng nếu ký tự \( ch \) không xuất hiện trong dãy \( T \), dãy \( S \) sẽ là toàn bộ dãy \( T \).
Dưới đây là mã Python để giải mã dãy \( S \) từ dãy \( T \) và ký tự \( ch \):
```python
def find_original_string(T, ch):
S = ""
# Duyệt qua từng ký tự trong T
for char in T:
if char == ch:
break # Dừng lại khi gặp ký tự ch
S += char # Thêm ký tự vào S nếu không phải là ch
return S
# Nhập dãy T và ký tự ch
T = input("Nhập dãy T: ")
ch = input("Nhập ký tự ch: ")
# Gọi hàm và in ra dãy S
S = find_original_string(T, ch)
print("Dãy S là:", S)
```
### Hướng dẫn sử dụng:
1. Chạy mã Python trên máy tính của bạn.
2. Nhập vào dãy \( T \) (ví dụ: "abcdeedcba").
3. Nhập vào ký tự \( ch \) (ví dụ: "c").
4. Mã sẽ xuất ra dãy \( S \).
### Cách hoạt động:
- Hàm `find_original_string` nhận dãy \( T \) và ký tự \( ch \) để tìm dãy \( S \).
- Mã sử dụng vòng lặp để duyệt từng ký tự trong \( T \).
- Khi gặp ký tự \( ch \), vòng lặp dừng lại và dãy \( S \) được trả về.
Hy vọng mã này hữu ích cho bạn! Nếu bạn có bất kỳ câu hỏi nào khác, hãy cho tôi biết.
Quảng cáo
Bạn cần hỏi gì?
Câu hỏi hot cùng chủ đề
-
1266
-
Đã trả lời bởi chuyên gia
1030 -
-
Đã trả lời bởi chuyên gia
-
Đã trả lời bởi chuyên gia
-
Đã trả lời bởi chuyên gia
-
Đã trả lời bởi chuyên gia
-
