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)
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)
#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;
}
};
Thấy sol bọn nó chơi Z algo mới pass
1 số thì chơi hash được
Bọn nó hash thì AC, e hash thì WA mấy test cuối
N^2 thì lên 25 * 10^8 rồi thím, sống sao được
- 1 <= target.length <= 5 * 104
Chia sẻ mình ý tưởng thử proplayer, sao lại xài đc bisearch trên hash thế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ã:

Mình chưa lên guardian fence, mới hơn 2k 1 tí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
hi vọng 3 4 tháng nữa có thể lên được.là sao thím, ý tưởng bài này à hay ý tưởng binary serach?Chia sẻ mình ý tưởng thử proplayer, sao lại xài đc bisearch trên hash thế![]()
À 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 functionlà 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ĩ.
okie ngon rùi. Tranh thủ chứ có em bé tới lúc 3 tuổi ko có ông bà cũng đuốiMì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à.

Đú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.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
Điểm danh phát :
Xem tệp đính kèm 2695427
Q2 ăn 1 bọ, đặt sai boundary vl thật. Bt cứ cho kịch khung boundaryXem tệp đính kèm 2695450
Em cũng xong rồi nhưng mà ăn 3 bọ. Lâu lắm mới có 1 contest Q4 ko khó để làm được cả.

Mình submit chung 1 solution, pass luôn (sliding windows). Nó tăng cái constraint của word1 lên 10^6 thôi.Ủa Q4 với Q3 khác gì nhau ae? đều xài sliding windows mà
