losser50cm
Member
sai rồi, private nó cũng kế thừa đc. chỉ là k access trực tiếp đc từ class con thôi.
Tức là vẫn phải thông qua getter đúng không ạ
Sent from Google Pixel 4 using vozFApp
sai rồi, private nó cũng kế thừa đc. chỉ là k access trực tiếp đc từ class con thôi.
phải thông qua getter từ class chaTức là vẫn phải thông qua getter đúng không ạ
Sent from Google Pixel 4 using vozFApp
mình viết sai là kế thừa, đáng ra phải là "access" được, còn private thì kế thừa bình thườngem không hiểu lắm. access này khác gì việc các class khác(không phải class con) nó sử dụng getter từ class cha ạ?phải thông qua getter từ class chamình viết sai là kế thừa, đáng ra phải là "access" được, còn private thì kế thừa bình thường
Không khác gì hết. Vậy nên hãy dùng protected nếu muốn inherit và sử dụng biến của class cha cho class conem không hiểu lắm. access này khác gì việc các class khác(không phải class con) nó sử dụng getter từ class cha ạ?

vậy thì tại sao nói là lớp con kế thừa hết các dữ liệu private ở lớp cha ạ? có ví dụ nào cho thấy lớp con kế thừa hết các dữ liệu này không thím? còn nếu kế thừa hết mà không khác gì các class khác vẫn phải thông qua getter thì em không biết là khác gì vs không kế thừa?Không khác gì hết. Vậy nên hãy dùng protected nếu muốn inherit và sử dụng biến của class cha cho class con![]()
gọi sizeof(lớp con) là thấy size của lớp con có bao gồm dữ liệu lớp cha thoyvậy thì tại sao nói là lớp con kế thừa hết các dữ liệu private ở lớp cha ạ? có ví dụ nào cho thấy lớp con kế thừa hết các dữ liệu này không thím? còn nếu kế thừa hết mà không khác gì các class khác vẫn phải thông qua getter thì em không biết là khác gì vs không kế thừa?
Ví dụ đây:vậy thì tại sao nói là lớp con kế thừa hết các dữ liệu private ở lớp cha ạ? có ví dụ nào cho thấy lớp con kế thừa hết các dữ liệu này không thím? còn nếu kế thừa hết mà không khác gì các class khác vẫn phải thông qua getter thì em không biết là khác gì vs không kế thừa?
class A {
public:
int a1 = 1;
private:
int a2 = 2;
};
class B : public A{
public:
int b1 = 3;
private:
int b2 = 4;
};
int main() {
A a;
B b;
}
B* bb = &b;
cout << *(int*)(&bb->a1 + 1) << endl;
thanks thím :vvvVí dụ đây:
C++:class A { public: int a1 = 1; private: int a2 = 2; }; class B : public A{ public: int b1 = 3; private: int b2 = 4; }; int main() { A a; B b; }
Truy cập vào memory của a, sẽ thấy 2 biến có giá trị 1 (public) và 2(private)
Xem tệp đính kèm 1212535
Truy cập vào memory của b, sẽ thấy 4 biến có giá trị 1, 2, 3, 4 (bao gồm 1 và 2 từ class cha), nhưng ko access đc giá trị 2 do private
Xem tệp đính kèm 1212536
Lúc đấy chỉ có mò địa chỉ offset để lấy ra đc thôi
C++:B* bb = &b; cout << *(int*)(&bb->a1 + 1) << endl;
Có gì mà thử đâu, vào mà làm luôn đi bác, cơ bản form giống leetcode thôi, testcase nhiều bài chặt chẽ hơnhttps://binarysearch.com
Ở đây có thím nào thử trang này chưa?
Bổn tọa thử ròi, leetcode all the way nhéhttps://binarysearch.com
Ở đây có thím nào thử trang này chưa?




Bài leetcode sáng nay kinh vl. Giải mãi mới raVô pv gặp bài này chắc đắp chiếu quá
![]()
Dùng 2 cái Trie, 1 cái lưu xuôi, 1 cái lưu ngược. Sau khi search theo prefix với suffix thì sẽ ra 2 cái set. Kể quả là max value của intersection của 2 cái set đó. Chỗ này xử lý tinh tế 1 xíu thì sẽ k bị TLE.Nay có việc chưa làm được, mới đọc sơ thì ý tưởng là lưu cả string và reverse string vào cây 26-phân.
Để tối về code xem sao.
Sent from Samsung SM-A528B using vozFApp
bài nào đấy bác?Bài leetcode sáng nay kinh vl. Giải mãi mới raVô pv gặp bài này chắc đắp chiếu quá
![]()
Cái bài prefix suffix ấy bác. Mỗi ngày leetcode nó challenge mình 1 bài, nằm ngay trên đầu tất cả problems ấybài nào đấy bác?
Dùng 2 cái Trie, 1 cái lưu xuôi, 1 cái lưu ngược. Sau khi search theo prefix với suffix thì sẽ ra 2 cái set. Kể quả là max value của intersection của 2 cái set đó. Chỗ này xử lý tinh tế 1 xíu thì sẽ k bị TLE.
struct cmp {
bool operator()(const pair<string,int>&a,const pair<string,int>& b) const {
return (a.first==b.first?a.second>b.second:a.first<b.first);
}
};
class WordFilter {
public:
unordered_map<string,set<pair<string,int>,cmp>>m;
map<string,int>q;
WordFilter(vector<string>& words) {
int n=words.size();
for(int i=0;i<n;i++){
q[words[i]]=i;
}
for(auto x:q){
string z=x.first;
string u="";
for(int j=0;j<z.length();j++){
u+=z[j];
string h="";
for(int k=z.length()-1;k>=0;k--){
h+=z[k];
string p=h;
reverse(p.begin(),p.end());
m[u].insert({p,x.second});
}
}
}
}
int f(string prefix, string suffix) {
if(m[prefix].lower_bound({suffix,15001})!=m[prefix].end()){
pair<string,int>it=*m[prefix].lower_bound({suffix,15001});
if(suffix==it.first) return it.second;
}
return -1;
}
};
/**
* Your WordFilter object will be instantiated and called as such:
* WordFilter* obj = new WordFilter(words);
* int param_1 = obj->f(prefix,suffix);
*/
cách này k hẳn là tối ưu hơn đâu. Đồng ý là nó search nhanh hơn dùng 2 trie rồi intersect. Nhưng nó tốn mem hơn, và lúc build cái trie cũng lâu hơn nữa.Tôi cũng mới làm xong, search ra có cách này tối ưu hơn nè, chỉ cần dùng 1 trie thôi https://www.geeksforgeeks.org/searc...with-a-given-prefix-and-suffix-for-q-queries/
Sent from Samsung SM-A528B using vozFApp
cách này k hẳn là tối ưu hơn đâu. Đồng ý là nó search nhanh hơn dùng 2 trie rồi intersect. Nhưng nó tốn mem hơn, và lúc build cái trie cũng lâu hơn nữa.
Vd từ word = "apple"
cách 1: lưu "apple" vào prefixTrie, lưu "elppa" vào suffixTrie.
cách 2: lưu e{apple, le{apple, ple{apple, pple{apple, apple{apple vào trie.
Nhìn qua là thấy cách 2 tốn mem và build trie lâu hơn rồi.
=> cách 1 phù hợp với trường hợp số lượng word nhiều, word dài
=> cách 2 phù hợp với trường hợp số lượng word ít, word ngắn, số lượng search query lớn.