Chương trình C++ gặp lỗi SIGSEGV khi submit bài giải lên spoj server?

Đây là link đề :


Và đây là code của em

#include<stdio.h>
#include<string.h>
char s[1000000],t[1000000];
int strin()
{
    int i,j,vt;
    for (i=0; i<=strlen(s)-strlen(t); i++)
    {
        j=0,vt=i;
        while (s[vt]==t[j]&&j<strlen(t))
        {
            vt++;
            j++;
        }
        if (j==strlen(t)) return i;
    }
    return -1;
}
void xoasau(int vt)
{
    char kq[1000000];
    int i,m=0;
    for (i=0; i<vt; i++)
        kq[m++]=s[i];
    for (i=vt+strlen(t); i<strlen(s); i++)
        kq[m++]=s[i];
    kq[m]='\0';
    strcpy(s,kq);
}
main()
{
    int vt;
    gets(s);
    gets(t);
    while ( strin()!=-1 &&strlen(s)>=strlen(t))
    {
        vt = strin();
        xoasau(vt);
    }
    puts(s);
}

Thử khá nhiểu test thấy nó đúng
cũng k hiểu liệu nó có tràn mảng ở đoạn nào mà lại lối SIG
Mọi người xem giúp lỗi SIG ngoài tràn mảng còn có thể là lỗi gì ạ?

Có khá nhiều nguyên nhân, @M2T có thể xem danh sách các lỗi ở đây.

@M2T riêng về việc test ở tren máy dúng mà up lên server thì lại sai thì Đạt nghĩ là do cách input của server và cách input data ở máy của @M2T có sự khác biệt.

@M2T đọc lại input của server SPOJ nó cho dữ liệu vào như thế nào, có thể giải thuật không sai mà sai ở chỗ đọc input đấy.

Gặp lỗi đúng rồi
test:

onbatoonncaveon
onbatoonncaveo

là tạch ngay.
Do cái này nè while ( strin()!=-1 && strlen(s)>=strlen(t) ){
tức với test trên, kq cuối là thì len(s) = 1.
Bạn gọi hàm strin() trc nên nó sẽ bay vào hàm đó và múa lửa ở trõng. Mà s < t trừ nhau ra âm -> tạch
Để sửa thì bạn chỉ cần đảo ngược điều kiện lại while ( strlen(s)>=strlen(t) && strin()!=-1 ){ là ok ngay :slight_smile:
Anyway, code bị TLE rồi nhé :stuck_out_tongue:

2 Likes

ồ, thanks
chưa thử đến cái test đó :3

1 Like

@M2T test thử giải pháp của @drgnz, nếu thấy đúng thì nhớ bấm vào nút trên trả lời của @drgnz để chọn câu trả lời đúng nhé.

@drgnz
không bị lỗi với test bạn nói
trong trường hợp trên thì
strin chạy và trả về gia trị bắt đầu xuất hiện xâu con
và vẫn thỏa mãn len(s)>len(t) vì hàm xoasau chưa dc thực hiện mà nó thực hiện ở trong vòng while cơ !
nên test kia vẫn ổn !
Bọn xem giúp xem, minh đang muốn xem cái lỗi SIG kia đã còn thuật toán sai nó sẽ báo Wrong Answer ngay !
Sao lại lại SIG là vấn đề mình đang thắc mắc !

lỗi đc bạn :?


fixed (nộp bị TLE):

Đây, khi bạn xóa xâu, sâu S chỉ còn n.
Nhưng vòng while chưa kết thúc. Nó quay lại, kiểm tra điều kiện tiếp tục. Thì lúc này s = n; len(s) = 1 đc hàm strin() sử dụng. Nên ghi len(s)-len(t) ra số âm mà có vẻ như nó auto chuyển thành số dương cực lớn. Nên mảng tràn.

2 Likes


thế mà mình chạy trên geany lại ok chứ @@
hàm strin sử dụng nhưng nó sẽ return -1 vì k chứa xâu con nên nó sẽ thoát while chứ nhỉ??
Dù sao cũng rất cảm ơn bạn nhiệt tình xem giúp !!

1 Like

@_@
what the what!
ideone chạy trên linux cùng nhau mà s ảo v trời :v

1 Like

thế pro có giải thuật nào khác AC k? :stuck_out_tongue:

Sử dụng thuật toán string matching KMP…

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?