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: