Code mẫu

Trần Nguyên Vũ  •  1 tháng trước


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 ^^


Bình luận: