Code chạy bình thường nhưng vào Themis chấm thì lại lỗi


Chuyện là em có lấy bài này trên mạng về làm thử, khó hiểu cái là code của em chạy chay tất cả test của bài này rất là ngon lành.
Có thể thấy ví dụ là ảnh dưới em chạy test a.size() = 2*10^6 và chạy rất ngon lành

Nhưng em không hiểu vì sao Themis chạy thì lại fail hết. Em đã test bằng themis của máy khác và cũng bị lỗi tương tự vậy.

dạ đây là code của em ạ

#include <bits/stdc++.h>
using namespace std;
const long long N = 2000005;
string a;
string b;
long long countt = 0;
long long cc[N][30] = {0};
long long maxx = 0;
int main() {
    freopen("CONVSTR.inp", "r", stdin);
    freopen("CONVSTR.out", "w", stdout);
    cin >> b >> a;
    maxx = (long long)a[0]-97;
    cc[0][(int)a[0]-97]++;
    for(int i = 1; i!= a.size(); i++){
        maxx = max(maxx, (long long)a[i]-97);
        cc[i][(int)a[i]-97] = cc[i-1][(int)a[i]-97] + 1;
        for(int j = 0 ; j!= maxx +1; j++){
            if(j == (int)a[i]-97) continue;
            cc[i][j] = cc[i-1][j];
        }
    }
    countt += cc[a.size()-b.size()][(int)b[0]-97];
    for(int i = 1; i!= b.size(); i++) countt += cc[a.size()-b.size()+i][(int)b[i]-97] - cc[i-1][(int)b[i]-97];
    cout << countt;
    return 0;
}

Đây là link download file test ạ: CONVSTR - Google Drive
Em mong mọi người giúp ạ. Em khá sợ lở đi thi mà gặp trường hợp này chắc chết luôn quá @@.

1 Like

Bạn đã setting input output file cho task trên Themis chưa?

Đề yêu cầu nhập từ bàn phím và in ra màn hình, vậy input, output đều là standard input và standard output, tại sao bạn lại freopen file input và output?

3 Likes

đề này em lấy từ 1 cuộc thi nhỏ. nó kêu là input ouput từ bàn phím và in ra màn hình rồi sẽ nó sẽ xử lý phần đó backend sau. Còn này là file test và đề thi được cung cấp sau khi cuộc thi đó đã hoàn thành xong rồi ạ. Em đã config setting đày đủ cụ thể như hình
image

1 Like

Vậy bạn bỏ freopen ở code của bạn là được.

1 Like

Cuộc thi này nó không yêu cầu mình freopen ở code, vì nó có thể xử lý vụ này để chấm bài ở backend. Còn đây là em tải Test case và đề bài nó cung cấp từ google drive sau khi cuộc thi nó đã hoàn tất và em sử dụng phần mềm Themis để chấm bài, nên việc sử dụng freeopen hiển nhiên rồi ạ.

Máy chấm Themis yêu cầu đầu vào là standard input và đầu ra là standard output, bạn freopen để đọc ra và ghi vào file, vậy bạn đâu có đọc được dữ liệu?

Nếu bạn không muốn bỏ freopen thì bỏ tick Dùng luồng vào chuẩn và Dùng luồng ra chuẩn ở setting task CONVSTR đi.

3 Likes


Em bỏ freeopen rồi vẫn vậy ạ :. Mà testcase của bài khác em freeopen vẫn chấm ngon lành mà.

Mình đã chạy code của bạn trên ideone và không thấy có vấn đề gì. Mình đã search thử mã lỗi do Themis sinh ra sau khi chạy code và thấy link này:

Có lẽ do bạn dùng tốn memory quá.

3 Likes

em khai báo mảng 2 chiều xuống [1000][30] vẫn dính lỗi ạ :frowning:

mà em khái bảo mảng dp[2*10^6+5][30] thì cũng đâu quá nhiều đâu ạ :frowning:

  1. Chỉ có 26 ký tự latin thường, chiều thứ 2 của mảng dp bạn không cần phải khai báo quá lên như vậy.

  2. Tính sơ sơ mảng dp của bạn đã tốn \dfrac{8\ byte * (2e6+5)*30}{1024^2} \approx 457.76 MB, không ít đâu bạn.

    Các bài competitive programming chỉ cho 256MB memory cũng là khá ít chứ không nhiều đâu.

2 Likes

Dạ em cảm ơn bác, em sẽ để ý vụ dung lượng bộ nhớ này vào các bài thi sau ^^
nhưng mà em đã thử nâng giới hạn bộ nhớ lên 2048mb vẫn báo lỗi :(.

Những chỗ so sánh với .size() mà sử dụng != thì rất nguy hiểm. Bạn nên sửa lại thành <. Mình cảm giác lỗi của bạn là do chỗ này.

1 Like

Em nghĩ là không đâu, tại em chạy chay 16 test trên thì đúng hết @@.

Mã lỗi 0xC0000017 là lỗi của hệ điều hành chứ không phải của ứng dụng (Thermis).
Do hệ điều hành đã chặn ứng dụng sử dụng nhiều bộ nhớ (RAM).

Thực sự thì trong testcase này ứng dụng thực thi đoạn mã của bạn đã dùng quá nhiều bộ nhớ, hệ điều hành đã chặn nó.

5 Likes

có cách nào fix không ạ :frowning: rồi vô thi có bị không

Theo mình thì fix thuật toán bạn ơi :frowning:

bạn xem fix hộ mình với mình làm mọi cách rồi

match như thế này:

abaab
aababacab
^  ^^
 abaab
aababacab
 ^^^
  abaab
aababacab
     ^
   abaab
aababacab
   ^^^
    abaab
aababacab
       ^^
Tổng = 12

bài toán có thể tách thành length(B) bài toán nhỏ: tìm số lần xuất hiện của ký tự B[i] trong chuỗi con A[i..i+length(B)-1] với i chạy từ 0 tới length(B)-1 :V

vd

i=0

a
aabab....
^
 a
aabab....
 ^
  a
aabab....

   a
aabab....
   ^
    a
aabab....

Số lần xh của a trong aabab = 3

i=1

 b
.ababa...

  b
.ababa...
  ^
   b
.ababa...
     
    b
.ababa...
    ^
     b
.ababa...

Số lần xh của b trong ababa = 2

với chuỗi A[i..i+length(B)-1] ta có thể đếm tần số xuất hiện của 26 chữ cái trong O(len(B)), và chỉ cần 1 mảng 26 int là đủ :V Từ chuỗi A[i..i+length(B)-1] có thể suy ra tần số chữ cái của A[i+1..i+length(B)] bằng cách -1 số lần xuất hiện của A[i] và +1 số lần xh của A[i+length(B)], thực hiện trong O(1).

vd tần số chữ cái của aabab là 3 a và 2 b, có thể tính tần số chữ cái của ababa bằng cách -1 a đầu tiên của aabab và +1 a cuối cùng của ababa :V ra 3 a và 2 b dễ dàng.

Vậy tổng cộng độ phức tạp là O(length(B)) + length(B) * O(1) = O(length(B)) :V

4 Likes

Bạn gắn thêm thanh RAM gắn vô hoặc tăng pagefile/swapfile có thể sẽ pass đó

2 Likes

Cách của bạn khó hình dung quá.

Theo chủ thớt thì sẽ làm ntn:

A = aababacab
    ^^^^^----
B =     abaab
        ^

Đầu tiên lấy bảng tần suất của phần aabab (A)

a b c
3 2 0

sau đó B[i] ứng với kí tự thứ |B|-|A|+i của A

a b c
3 2 0
^

Cập nhật

A = aababacab
    -    +
B =     abaab
         ^
a b c
3 2 0
  ^
3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?