intgetMaxSum(vector<int>& A, int len, vector<int>&v) { int i=0; int sum=0; int maxsum=0; for(i=0;i<len;++i) sum+=A[i]; v[len-1]=sum; maxsum = sum; for(i=len;i<A.size();++i) { sum=sum-A[i-len]+A[i]; maxsum=max(sum,maxsum); v[i]=maxsum; } return0; } intmaxSumTwoNoOverlap(vector<int>& A, int L, int M){ int n = A.size(); vector<int> B = A; reverse(B.begin(),B.end()); vector<int> L1(n,0); vector<int> L2(n,0); vector<int> M1(n,0); vector<int> M2(n,0); getMaxSum(A, L, L1); getMaxSum(B, M, M1); int sum1=0; for(int i = L-1;i<n-M;++i) { int x = i; int y = n-1-(i+1); sum1=max(sum1,L1[i]+M1[n-1-(i+1)]); } int sum2=0; int res = 0; getMaxSum(A, M, L2); getMaxSum(B, L, M2); for(int i = M-1;i<n-L;++i) { sum1=max(sum1,L2[i]+M2[n-1-(i+1)]); } res = max(sum1,sum2); return res; } };
class TrieNode{ public: bool hasVal=false; vector<TrieNode*> children; TrieNode() : children(26,NULL){} }; class TrieTree{ public: TrieNode* root; TrieTree() { root = new TrieNode(); } int insert(string& word) { TrieNode* p = root; for(int i = 0; i < word.length(); ++i) { int n=word[i]-'a'; if(p->children[n]==NULL){ p->children[n]=new TrieNode(); } p=p->children[n]; } p->hasVal=true; return 0; } bool query_has_r_suffix(string& word) { TrieNode* p = root; for(int i=word.length()-1;i>=0;--i){ char ch = word[i]; int n=ch-'a'; if(p->children[n]==NULL){ return false; } p=p->children[n]; if(p->hasVal) return true; } return false; } }; class StreamChecker { TrieTree * tree =new TrieTree(); string suf_str; public: StreamChecker(vector<string>& words) { for(string w:words){ reverse(w.begin(),w.end()); tree->insert(w); } } bool query(char letter) { suf_str.push_back(letter); return tree->query_has_r_suffix(suf_str); } };
/** * Your StreamChecker object will be instantiated and called as such: * StreamChecker* obj = new StreamChecker(words); * bool param_1 = obj->query(letter); */