#include<bits/stdc++.h>
using namespace std;
class Trie{
private:
static const int chars =26;
Trie* child[chars];
bool isLeaf {};
public:
Trie(){
memset(child,0,sizeof(child));
}
void insert(string s ,int idx){
if(idx == s.length()){
isLeaf =true;
}
else{
int cur = s[idx]-'a';
if(child[cur] == nullptr){
child[cur] = new Trie();
}
child[cur]->insert(s,idx+1);
}
}
vector<string>getAllsubstr(string s){
vector<string> res;
for(int i=0;i<s.length();i++){
for(int j=i+1;j<=s.length();j++){
res.push_back(s.substr(i,j-i));
}
}
return res;
}
vector<string> findSubs(const string& s,vector<string>&q){
vector<string> poss=getAllsubstr(s);
vector<string>ans;
for(auto word :q){
for(auto sub : poss){
if(sub==word){
ans.push_back(sub);
break;
}
}
}
return ans;
}
};
int main(){
Trie trie;
trie.insert("hello",0);
trie.insert("world",0);
vector<string> q = {"hello","world","elhabbal","cr7"};
vector<string> subs = trie.findSubs("helloworldmanarelhabbal",q);
for(auto word : subs){
cout<<word<<endl;
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFRyaWV7CiAgICBwcml2YXRlOgogICAgc3RhdGljIGNvbnN0IGludCBjaGFycyA9MjY7CiAgICBUcmllKiBjaGlsZFtjaGFyc107CiAgICBib29sIGlzTGVhZiB7fTsKCiAgICBwdWJsaWM6CiAgICBUcmllKCl7CiAgICAgICAgbWVtc2V0KGNoaWxkLDAsc2l6ZW9mKGNoaWxkKSk7CiAgICB9CiAgICAKICAgIHZvaWQgaW5zZXJ0KHN0cmluZyBzICxpbnQgaWR4KXsKICAgICAgICBpZihpZHggPT0gcy5sZW5ndGgoKSl7CiAgICAgICAgICAgIGlzTGVhZiA9dHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgICAgaW50IGN1ciA9IHNbaWR4XS0nYSc7CiAgICAgICAgICAgIGlmKGNoaWxkW2N1cl0gPT0gbnVsbHB0cil7CiAgICAgICAgICAgICAgICBjaGlsZFtjdXJdID0gbmV3IFRyaWUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjaGlsZFtjdXJdLT5pbnNlcnQocyxpZHgrMSk7CiAgICAgICAgfQogICAgfQogICAgdmVjdG9yPHN0cmluZz5nZXRBbGxzdWJzdHIoc3RyaW5nIHMpewogICAgICAgIHZlY3RvcjxzdHJpbmc+IHJlczsKICAgICAgICBmb3IoaW50IGk9MDtpPHMubGVuZ3RoKCk7aSsrKXsKICAgICAgICAgICAgZm9yKGludCBqPWkrMTtqPD1zLmxlbmd0aCgpO2orKyl7CiAgICAgICAgICAgICAgICByZXMucHVzaF9iYWNrKHMuc3Vic3RyKGksai1pKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KICAgIHZlY3RvcjxzdHJpbmc+IGZpbmRTdWJzKGNvbnN0IHN0cmluZyYgcyx2ZWN0b3I8c3RyaW5nPiZxKXsKICAgICAgICB2ZWN0b3I8c3RyaW5nPiBwb3NzPWdldEFsbHN1YnN0cihzKTsKICAgICAgICB2ZWN0b3I8c3RyaW5nPmFuczsKICAgICAgICBmb3IoYXV0byB3b3JkIDpxKXsKICAgICAgICAgICAgZm9yKGF1dG8gc3ViIDogcG9zcyl7CiAgICAgICAgICAgICAgICBpZihzdWI9PXdvcmQpewogICAgICAgICAgICAgICAgICAgIGFucy5wdXNoX2JhY2soc3ViKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYW5zOwogICAgfQp9OwppbnQgbWFpbigpewogICAgVHJpZSB0cmllOwogICAgdHJpZS5pbnNlcnQoImhlbGxvIiwwKTsKICAgIHRyaWUuaW5zZXJ0KCJ3b3JsZCIsMCk7CiAgIAogICAgdmVjdG9yPHN0cmluZz4gcSA9IHsiaGVsbG8iLCJ3b3JsZCIsImVsaGFiYmFsIiwiY3I3In07CiAgICB2ZWN0b3I8c3RyaW5nPiBzdWJzID0gdHJpZS5maW5kU3VicygiaGVsbG93b3JsZG1hbmFyZWxoYWJiYWwiLHEpOwogICAgZm9yKGF1dG8gd29yZCA6IHN1YnMpewogICAgICAgIGNvdXQ8PHdvcmQ8PGVuZGw7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9