//朴素Trie再DFS做法//必须剪枝时间复杂度才够classSolution{public:int son[100000][26];int end[100000];int idx =0;booldfs(string& s,int startIndex){if(startIndex == s.size())returntrue;
string temp ="";for(int i = startIndex; i < s.size(); i++){
temp += s[i];if(query(temp)){if(dfs(s, i +1))returntrue;}}returnfalse;}boolquery(string& s){int p =0;for(char& c: s){int x = c -'a';if(son[p][x]==-1)returnfalse;
p = son[p][x];}return end[p];}voidinsert(string& s){int p =0;for(char& c : s){int x = c -'a';if(son[p][x]==-1) son[p][x]=++idx;
p = son[p][x];}
end[p]=1;}boolstaticcmp(string& a, string& b){return a.size()< b.size();}
vector<string>findAllConcatenatedWordsInADict(vector<string>& words){memset(son,-1,sizeof son);memset(end,0,sizeof end);int n = words.size();sort(words.begin(), words.end(), cmp);
vector<string> ans;for(int i =0; i < n; i++){if(words[i]=="")continue;if(dfs(words[i],0)) ans.push_back(words[i]);//A是X、Y、Z连接词,则由A构成的连接词B可以由X、Y、Z构成//剪枝,A不用再添加elseinsert(words[i]);}return ans;}};
//Query操作中直接DFSclassSolution{public:int son[100000][26];int end[100000];int idx =0;booldfs(string& s,int startIndex){if(startIndex == s.size())returntrue;
string temp ="";for(int i = startIndex; i < s.size(); i++){
temp += s[i];if(query(temp)){if(dfs(s, i +1))returntrue;}}returnfalse;}boolquery(string& s){int p =0;for(char& c: s){int x = c -'a';if(son[p][x]==-1)returnfalse;
p = son[p][x];}return end[p];}voidinsert(string& s){int p =0;for(char& c : s){int x = c -'a';if(son[p][x]==-1) son[p][x]=++idx;
p = son[p][x];}
end[p]=1;}boolstaticcmp(string& a, string& b){return a.size()< b.size();}
vector<string>findAllConcatenatedWordsInADict(vector<string>& words){memset(son,-1,sizeof son);memset(end,0,sizeof end);int n = words.size();sort(words.begin(), words.end(), cmp);
vector<string> ans;for(int i =0; i < n; i++){if(words[i]=="")continue;if(dfs(words[i],0)) ans.push_back(words[i]);//A是X、Y、Z连接词,则由A构成的连接词B可以由X、Y、Z构成//剪枝,A不用再添加elseinsert(words[i]);}return ans;}};