thảo luận Leetcode mỗi ngày

  • Người tạo chủ đề Người tạo chủ đề _Gia_Cat_Luong_
  • Ngày bắt đầu Ngày bắt đầu
Trạng thái
Không mở để trả lời thêm.
Xác nhận là cái test case này làm TLE tất cả các cách nhé. Trie cũng chết nốt. Trie còn chậm hơn HashMap trừ khi Trie là nhiều ký tự trở lên ở mỗi level thì tui chưa thử.
vậy là thằng ra đề LC dỏm
JEWoIdl.png

cái test case 1.4MB có submit nổi cho LC test case đâu
MjfezZB.png
 
Trie + Manacher chuẩn O(nk) không sợ các loại test case.
https://leetcode.com/submissions/detail/801992042/

Ý tưởng là dùng thuật toán Manacher để tính trước tất cả các palindrome dạng [0, i) với mọi word trong thời gian O(k), để khỏi phải check palindrome mỗi lần O(k^2).

Ở đây có cải biên Manacher một chút là chỉ duyệt đến nửa chuỗi, nếu tính được d tràn chuỗi thì coi như đoạn [0, i) là palindrome.

Nhưng vẫn chậm. Dù đã dùng pool các trie node để để hạn chế cấp phát động.

thử 4700 words length 300 và 300 words len từ 0-299 của bác bribnt chưa
MjfezZB.png
cũng vậy thoy hack quá
JEWoIdl.png


ví dụ toy generate từ test case 135 nè:
Trie + Manacher mất khoảng 544ms với test này. Chắc vẫn suýt soát AC.
 
Sửa lần cuối:
Trie + Manacher chuẩn O(nk) không sợ các loại test case.
https://leetcode.com/submissions/detail/801992042/

Ý tưởng là dùng thuật toán Manacher để tính trước tất cả các palindrome dạng [0, i) với mọi word trong thời gian O(k), để khỏi phải check palindrome mỗi lần O(k^2).

Ở đây có cải biên Manacher một chút là chỉ duyệt đến nửa chuỗi, nếu tính được d tràn chuỗi thì coi như đoạn [0, i) là palindrome.

Nhưng vẫn chậm. Dù đã dùng pool các trie node để để hạn chế cấp phát động.


Trie + Manacher mất khoảng 544ms với test này. Chắc vẫn suýt soát AC.
Nhìn code bác khiếp thế @@ Còn cách nào đơn giản hơn không bác :v
 
Tiện thể thì các kết quả 100 - 200ms bên C++ là từ thời xưa, giờ cập nhất test case rồi chạy lại sẽ chậm hơn rất nhiều.

Nhìn code bác khiếp thế @@ Còn cách nào đơn giản hơn không bác :v

Dùng cách của các bác trên kia nhé.
Cả Trie lẫn thuật toán Manacher chả có cái nào là code đơn giản hết. Phải debug mấy tiếng mới xong.
 
Trie + Manacher chuẩn O(nk) không sợ các loại test case.
https://leetcode.com/submissions/detail/801992042/

Ý tưởng là dùng thuật toán Manacher để tính trước tất cả các palindrome dạng [0, i) với mọi word trong thời gian O(k), để khỏi phải check palindrome mỗi lần O(k^2).

Ở đây có cải biên Manacher một chút là chỉ duyệt đến nửa chuỗi, nếu tính được d tràn chuỗi thì coi như đoạn [0, i) là palindrome.

Nhưng vẫn chậm. Dù đã dùng pool các trie node để để hạn chế cấp phát động.


Trie + Manacher mất khoảng 544ms với test này. Chắc vẫn suýt soát AC.
thế giới của CP là đây à :p:p:p nhìn khiếp thật
 
Trie + Manacher chuẩn O(nk) không sợ các loại test case.
https://leetcode.com/submissions/detail/801992042/

Ý tưởng là dùng thuật toán Manacher để tính trước tất cả các palindrome dạng [0, i) với mọi word trong thời gian O(k), để khỏi phải check palindrome mỗi lần O(k^2).

Ở đây có cải biên Manacher một chút là chỉ duyệt đến nửa chuỗi, nếu tính được d tràn chuỗi thì coi như đoạn [0, i) là palindrome.

Nhưng vẫn chậm. Dù đã dùng pool các trie node để để hạn chế cấp phát động.


Trie + Manacher mất khoảng 544ms với test này. Chắc vẫn suýt soát AC.
185 dòng thoy xài cách hack kia thoy
4gmOAMB.png
 
185 dòng thoy xài cách hack kia thoy
4gmOAMB.png
Hơi muộn nhưng vừa nghĩ cách khác cũng O(nk) nhưng đơn giản hơn dùng Hash chứ không phải Trie.
Để ý thấy những lần tính hash toàn là của những substring khác nhau mỗi ký tự cuối. Nên có thể tận dụng để tính lại hash của substring sau dựa vào cái trước trong O(1).

----
Edited: quên mất vẫn còn phải check key equal nên vẫn là O(nk^2), nhưng đỡ được phần tính hash là có cải thiện rồi.
 
Sửa lần cuối:
Hơi muộn nhưng vừa nghĩ cách khác cũng O(nk) nhưng đơn giản hơn dùng Hash chứ không phải Trie.
Để ý thấy những lần tính hash toàn là của những substring khác nhau mỗi ký tự cuối. Nên có thể tận dụng để tính lại hash của substring sau dựa vào cái trước trong O(1).
có chắc là hash ko trùng nhau ko
zQU2cJa.png


mà cái implement O(nk) kia có chắc là O(nk) ko 5000 x 300 = 1.5e6 đáng lẽ chạy vài chục tới 100ms thoy chứ
qqNkq6W.gif
 
có chắc là hash ko trùng nhau ko
zQU2cJa.png


mà cái implement O(nk) kia có chắc là O(nk) ko 5000 x 300 = 1.5e6 đáng lẽ chạy vài chục tới 100ms thoy chứ
qqNkq6W.gif

Edit rồi, kể cả hash ko trùng thì vẫn phải có bước compare key nên vẫn mất O(nk^2). Nhưng đỡ được phần tính hash là có cải thiện rồi.

Trie đúng là O(nk) nhưng miss cache nhiều quá nên chậm, nên mới nghĩ cách xài hash.
 
Edit rồi, kể cả hash ko trùng thì vẫn phải có bước compare key nên vẫn mất O(nk^2). Nhưng đỡ được phần tính hash là có cải thiện rồi.

Trie đúng là O(nk) nhưng miss cache nhiều quá nên chậm, nên mới nghĩ cách xài hash.
nếu hash ko trùng thì có thể làm cái hash map có key là hash value/uint64_t thoy chứ ko cần key là string. Check string có trong hmap bằng cách check hash của string đó có trong hmap hay ko, so sánh uint64_t thì O(1) ngon lành ròi. Mà làm xao hash ko trùng được
zQU2cJa.png


có thể có cách tạo hash ko trùng được bằng cách lấy địa chỉ của chuỗi đó trong trie làm hash, nhưng làm vậy thì phải build trie cũng như ko ròi
qZV215Z.png


à có thể tốn bước build thoy còn mấy bước tìm kiếm sau đỡ phải miss cache gì đó
irGoYrZ.gif
à mà để tính hash value của 1 string thì cũng phải duyệt trong trie cũng như ko
MjfezZB.png


nói chung tạo trie là tương đương tạo unique hash cho mấy substring ròi
WawmAwM.png
 
Sửa lần cuối:
Các bác trình độ cao thế này sao không qua nước ngoài làm ạ. Thiết nghĩ giải được khoảng 50 bài Hard Leetcode thì có thể sang nước ngoài làm rồi chứ nhỉ.
 
Các bác trình độ cao thế này sao không qua nước ngoài làm ạ. Thiết nghĩ giải được khoảng 50 bài Hard Leetcode thì có thể sang nước ngoài làm rồi chứ nhỉ.
Vợ con bỏ lại cho ai?
Bố mẹ bỏ lại cho ai?
Sốc văn hóa?
Ở nước ngoài chắc gì đã ngon hơn ở Việt Nam đâu bạn
 
Trạng thái
Không mở để trả lời thêm.

Thống kê chủ đề

Ngày tạo
_Gia_Cat_Luong_,
Người trả lời cuối
Vipluckystar,
Trả lời
17.755
Lượt xem
1.212.714
Quay lại
Lên đầu trang