thảo luận Leetcode contest, đường tới Guardian

  • Người tạo chủ đề Người tạo chủ đề freedom.9
  • Ngày bắt đầu Ngày bắt đầu
Trạng thái
Không mở để trả lời thêm.
Bài 2 của mình bị Memory limit exceed phải convert qua bottom up
Python:
class Solution:
    def maxScore(self, a: List[int], b: List[int]) -> int:
        INF = 10**20
        NA = len(a)
        NB = len(b)

        @cache
        def dp(indexa, indexb):
            if indexa == NA:
                return 0
            if indexb == NB:
                return -INF

            ans = a[indexa]*b[indexb] + dp(indexa + 1, indexb + 1)
            ans = max(ans, dp(indexa , indexb + 1))
            return ans

        return dp(0, 0)

Mà đảo vế lại thì pass, cay thế nhỉ
Python:
class Solution:
    def maxScore(self, a: List[int], b: List[int]) -> int:
        INF = 10**20
        NA = len(a)
        NB = len(b)

        @cache
        def dp(indexa, indexb):
            if indexa == NA:
                return 0
            if indexb == NB:
                return -INF

            ans = dp(indexa , indexb + 1)
            ans = max(ans, a[indexa]*b[indexb] + dp(indexa + 1, indexb + 1))
            return ans

        return dp(0, 0)
 
vừa làm thử hash 2 base, 2 mod thì mới xanh, mà đọc code thằng top 1 sao nó hash vớ vẩn vẫn pass được tài thật
Java:
#define i64 long long
class Solution {
public:
    int minValidStrings(vector<string>& words, string target) {
        set<pair<i64,i64>>s;
        i64 base1=31,base2=37;
        i64 mod1=(1e9+7),mod2=(1e9+9);
        int n=target.size();
        i64 pow1[n+1];
        i64 pow2[n+1];
        for(auto x:words){
            i64 val1=0,val2=0;
            for(int j=0;j<x.length();j++){
                val1=(val1*base1+(x[j]-'a'+1))%mod1;
                val2=(val2*base2+(x[j]-'a'+1))%mod2;
                s.insert(make_pair(val1,val2));
            }
        }
        i64 hash1[n+1];
        pow1[0]=1;
        hash1[0]=0;
        i64 hash2[n+1];
        pow2[0]=1;
        hash2[0]=0;
        for(int i=1;i<=n;i++){
            pow1[i]=(pow1[i-1]*base1)%mod1;
            hash1[i]=((hash1[i-1]*base1)%mod1+(target[i-1]-'a'+1))%mod1;
            pow2[i]=(pow2[i-1]*base2)%mod2;
            hash2[i]=((hash2[i-1]*base2)%mod2+(target[i-1]-'a'+1))%mod2;
        }
        int cl=0,cr=0;
        int nl=0,nr=0;
        int cur=0;
        for(int i=0;i<=n;i++){
            if(nr<i) return -1;
            if(i>cr){
                cur+=1;
                cr=nr;
            }
            int l=i+1,r=n;
            int ans=-1;
            while(l<=r){
                int m=(l+r)>>1;
                int len=m-i;
                i64 hashVal1=(((hash1[m]-hash1[i]*pow1[len]%mod1))%mod1+mod1)%mod1;
                i64 hashVal2=(((hash2[m]-hash2[i]*pow2[len]%mod2))%mod2+mod2)%mod2;
                if(s.count(make_pair(hashVal1,hashVal2))>0){
                    ans=m;
                    l=m+1;
                }
                else r=m-1;
            }
            if(ans!=-1) nr=max(nr,ans);
        }
        return cur;
    }
};
Mã:
Thấy sol bọn nó chơi Z algo mới pass

1 số thì chơi hash được :sad:
Bọn nó hash thì AC, e hash thì WA mấy test cuối :too_sad:

N^2 thì lên 25 * 10^8 rồi thím, sống sao được :beat_brick:


  • 1 <= target.length <= 5 * 104
 
vừa làm thử hash 2 base, 2 mod thì mới xanh, mà đọc code thằng top 1 sao nó hash vớ vẩn vẫn pass được tài thật
Java:
#define i64 long long
class Solution {
public:
    int minValidStrings(vector<string>& words, string target) {
        set<pair<i64,i64>>s;
        i64 base1=31,base2=37;
        i64 mod1=(1e9+7),mod2=(1e9+9);
        int n=target.size();
        i64 pow1[n+1];
        i64 pow2[n+1];
        for(auto x:words){
            i64 val1=0,val2=0;
            for(int j=0;j<x.length();j++){
                val1=(val1*base1+(x[j]-'a'+1))%mod1;
                val2=(val2*base2+(x[j]-'a'+1))%mod2;
                s.insert(make_pair(val1,val2));
            }
        }
        i64 hash1[n+1];
        pow1[0]=1;
        hash1[0]=0;
        i64 hash2[n+1];
        pow2[0]=1;
        hash2[0]=0;
        for(int i=1;i<=n;i++){
            pow1[i]=(pow1[i-1]*base1)%mod1;
            hash1[i]=((hash1[i-1]*base1)%mod1+(target[i-1]-'a'+1))%mod1;
            pow2[i]=(pow2[i-1]*base2)%mod2;
            hash2[i]=((hash2[i-1]*base2)%mod2+(target[i-1]-'a'+1))%mod2;
        }
        int cl=0,cr=0;
        int nl=0,nr=0;
        int cur=0;
        for(int i=0;i<=n;i++){
            if(nr<i) return -1;
            if(i>cr){
                cur+=1;
                cr=nr;
            }
            int l=i+1,r=n;
            int ans=-1;
            while(l<=r){
                int m=(l+r)>>1;
                int len=m-i;
                i64 hashVal1=(((hash1[m]-hash1[i]*pow1[len]%mod1))%mod1+mod1)%mod1;
                i64 hashVal2=(((hash2[m]-hash2[i]*pow2[len]%mod2))%mod2+mod2)%mod2;
                if(s.count(make_pair(hashVal1,hashVal2))>0){
                    ans=m;
                    l=m+1;
                }
                else r=m-1;
            }
            if(ans!=-1) nr=max(nr,ans);
        }
        return cur;
    }
};
Mã:
Chia sẻ mình ý tưởng thử proplayer, sao lại xài đc bisearch trên hash thế =((
 
Chúc mừng thớt đạt guardian. Minh chứng cho sự kiên trì. Xin hỏi chủ thớt có con nhỏ chưa với sắp xếp time cày ntn thế @freedom.9 TIA

via theNEXTvoz for iPhone
Mình chưa lên guardian fence, mới hơn 2k 1 tí =(( hi vọng 3 4 tháng nữa có thể lên được.
Mình chưa có con, ra tết vợ mới đẻ. Thời gian thì ngày nào cũng vô học với làm vài bài, gặp thuật toán nào khó khó thì search youtube rồi nghiền ngẫm thôi, muốn học thì sắp xếp ngày vài tiếng học vô tư mà.
 
là sao thím, ý tưởng bài này à hay ý tưởng binary serach?
em dùng mấy biến tạm hơi khó hiểu chứ chúng nó toàn segtree/BIT để rmq cho đỡ phải nghĩ.
À mìn chưa hiểu cái ý tưởng dùng hash xong rồi binary search trên hash ấy. Đọc mới hiểu được cái Z function
 
Mình chưa lên guardian fence, mới hơn 2k 1 tí =(( hi vọng 3 4 tháng nữa có thể lên được.
Mình chưa có con, ra tết vợ mới đẻ. Thời gian thì ngày nào cũng vô học với làm vài bài, gặp thuật toán nào khó khó thì search youtube rồi nghiền ngẫm thôi, muốn học thì sắp xếp ngày vài tiếng học vô tư mà.
okie ngon rùi. Tranh thủ chứ có em bé tới lúc 3 tuổi ko có ông bà cũng đuối :)

via theNEXTvoz for iPhone
 
Có rank rồi ae, rank 1k1 mà đc cộng có 2 chục điểm thế này bao giờ mới lên bảo vệ nổi. Chắc muốn lên bảo vệ phải tầm 7 800 rating đều đều khó vl
 
Có rank rồi ae, rank 1k1 mà đc cộng có 2 chục điểm thế này bao giờ mới lên bảo vệ nổi. Chắc muốn lên bảo vệ phải tầm 7 800 rating đều đều khó vl
Đúng rồi bác, mà nếu có 1 contest bị thọt, được có 1-2Q thì điểm của bác sẽ bị trừ kha khá đấy. Như em ngay đầu tháng bị trừ 80đ vì giải có 1Q.
 
Điểm danh phát :
1726973633992.png
 
Ủa Q4 với Q3 khác gì nhau ae? đều xài sliding windows mà. Chả lẽ có cách nào đếm xịn hơn
 
Q2 mình chắc cốp add thêm test cases để test + Q3 ăn 1 bọ + Q4 review xem nó khác gì mất mấy phút. Quả đấy quyết đoán với Q3 làm chắc tay thì cũng phải nhanh hơn được 10p rồi :(
 
Trạng thái
Không mở để trả lời thêm.

Thống kê chủ đề

Ngày tạo
freedom.9,
Người trả lời cuối
freedom.9,
Trả lời
2.480
Lượt xem
130.241
Quay lại
Lên đầu trang