#1493 · DÃY CON MA THUẬT

MÔ TẢ BÀI TOÁN

Một dãy số b được gọi là dãy con của dãy số a nếu có thể tạo được dãy số b bằng cách lấy một số phần tử từ dãy số a mà không thay đổi thứ tự của chúng.

Một dãy số bất kỳ được gọi là một dãy ma thuật nếu khi đọc từ trái sang phải hoặc từ phải sang trái đều giống nhau.

Yêu cầu: Cho một dãy số nguyên a: a_1, a_2,…, a_n, hãy cho biết dãy số a có chứa ít nhất một dãy con nào (gồm ít nhất 3 phần tử) tạo thành một dãy ma thuật hay không.

Ví dụ:

  • Dãy [1, 2, 1, 3] chứa ít nhất một dãy con ma thuật [1, 2, 1].
  • Dãy [1, 2, 3] không chứa bất kỳ dãy con ma thuật nào.
  • Dãy [1, 2, 1, 2, 1, 2, 1] có chứa nhiều dãy con ma thuật: [1, 2, 1], [2, 1, 2], [1, 2, 1, 2, 1], v.v.

Dữ liệu vào

  • Dòng thứ nhất gồm số nguyên n (3 ≤ n ≤ 10^5)
  • Dòng thứ hai gồm n số nguyên a_1, a_2, …, a_n (1 \leq a_i \leq n), với a_i là phần tử thứ i của a.

Dữ liệu đầu vào đảm bảo tổng của n trên tất cả các kiểm thử không vượt quá 10^5

Dữ liệu ra

Một dòng duy nhất thể hiện kết quả:

  • YES: nếu a có chứa ít nhất một dãy con (có ít nhất 3 phần tử) ma thuật
  • NO: ngược lại.

Ràng buộc

  • Thời gian giới hạn: 1 giây
  • Bộ nhớ giới hạn: 128 MB

BẢNG TỔNG QUAN KẾT QUẢ

# Tài khoản Kết suất Lúc nộp
1
1 ms 216 KB
301 Bytes
18/01/2025
10:04
2
H
1 ms 216 KB
359 Bytes
31/12/2024
04:43
3
1 ms 216 KB
413 Bytes
12/01/2025
19:02
4
T
Đỗ Chí Thành @24800600886
1 ms 216 KB
529 Bytes
20/11/2024
18:53
5
B
Trần Gia Bảo @2380600172
1 ms 216 KB
692 Bytes
03/01/2025
17:58
6
1 ms 216 KB
748 Bytes
13/12/2023
23:26
7
H
Võ Minh Hiển @24800600298
1 ms 220 KB
359 Bytes
21/10/2024
20:14
8
1 ms 220 KB
727 Bytes
13/12/2023
23:22
9
V
1 ms 220 KB
1284 Bytes
10/06/2025
19:49
10
B
Võ Công Bằng @2380600191
1 ms 284 KB
383 Bytes
19/02/2025
18:12
11
1 ms 284 KB
496 Bytes
06/12/2023
21:02
12
1 ms 284 KB
1155 Bytes
11/01/2025
09:10
13
1 ms 292 KB
451 Bytes
22/11/2023
01:08
14
1 ms 292 KB
1548 Bytes
20/11/2023
16:14
15
P
1 ms 296 KB
534 Bytes
18/12/2025
09:38
16
1 ms 300 KB
844 Bytes
04/09/2025
00:13
17
1 ms 300 KB
1555 Bytes
04/12/2023
03:12
18
1 ms 300 KB
1555 Bytes
04/12/2023
03:12
19
1 ms 300 KB
1555 Bytes
04/12/2023
03:12
20
1 ms 300 KB
1555 Bytes
04/12/2023
03:13

LỊCH SỬ CÁ NHÂN

Vui lòng đăng nhập để xem lịch sử làm bài của bạn.

THẢO LUẬN BÀI TOÁN

V
10 tháng trước

Code mẫu

Code hơi lỏ, có ai có code ngắn thì hãy bình luận cho mình tham khảo nhé mình cảm ơn ạ. Sau đây là code của mình ( có chú thích ):

#include <stdio.h>
#include <string.h>


// Hàm kiểm tra đối xứng
int kt(int start,int end,int a[])
{
    int len = end - start + 1;
    
    for(int i=0;i<len/2;i++)
      if(a[start + i] != a[end - i])
        return 0;
    return 1;
}

int main()
{
    int n;
    scanf("%d",&n);
    int a[n];
    
    for(int i=0;i<n;i++)
      scanf("%d",&a[i]);
    
    int flag = 0;
    
	// Xử lý n = 2
    if(n<=2) 
    {
      printf("NO");
      return 0;
    }
    
	// Xử lý trường hợp n = 3
    if(n==3)
    {
      flag = 1;
      for(int i=0;i<n/2;i++)
        if(a[i] != a[n-i-1])
          flag = 0;
      if(flag == 1)
        printf("YES");
      else
        printf("NO");
      return 0;
    }
    
    // Xử lý bộ 3 giống nhau
    for(int i=0;i<n;i++)
    {
      int dem = 0;
      for(int j=i+1;j<n;j++)
      {
        if(a[i] == a[j])
          dem++;
        if(dem >= 3)
        {
          printf("YES");
          return 0;
        }
      }
    }
      
      // Xử lý dãy con liên tiếp
      for(int i=0;i<n-2;i++)
      {
        for(int j = i + 2; j<n; j++)
        {
          if (kt(i,j,a) == 1) {
            flag = 1;
            break;
          }
        }
        if(flag == 1) break;
      }
      
      if(flag == 1)
        printf("YES");
      else
        printf("NO");
    
    return 0;
}

Các bước: xử lý n = 2 -> xử lý n = 3 -> bộ 3 giống nhau -> toàn bộ dãy con liên tiếp. Thật sự code này sẽ không tối ưu cho dữ liệu lớn và cách mình giải kiểu "Trâu Bò". Thế nên cao nhân cho em xin tham khảo code tối ưu hơn ^^

Vào thảo luận 0 Phản hồi
Viết code