class Solution {
int cnt=1;
queue<int> q;
string ans;
map<string,char>m;
public:
typedef struct in {
int son[128];
int fail;
string strInfo;
}in;
void insert(string s, in* trie) {
int u = 1, len = s.size();
for (int i = 0; i < len ; i++) {
int v=s[i];
if (!trie[u].son[v])
trie[u].son[v] = ++cnt;
u = trie[u].son[v];
}
if(trie[u].strInfo!=s) {
trie[u].strInfo+=s;
}
}
void getFail(in* trie) {
int u, y;
for (int i = 0; i < 128; i++) {
trie[0].son[i] = 1;
}
q.push(1); trie[1].fail = 0;
while (!q.empty()) {
u=q.front();
q.pop();
for (int i = 0; i < 128; i++) {
int v = trie[u].son[i];
int Fail = trie[u].fail;
if (!v) { trie[u].son[i] = trie[Fail].son[i]; continue; }
trie[v].fail = trie[Fail].son[i];
q.push(v);
}
}
}
void query(string s, int len, in* trie) {
int u = 1;
for (int i = 0; i < len ; i++) {
int k = 0;
int v=s[i];
k = trie[u].son[v];
ans.push_back(s[i]);
while (k > 1) {
if (trie[k].strInfo.size()>0) {
for(int j=0;j<trie[k].strInfo.size();j++)ans.pop_back();
ans.push_back(m[trie[k].strInfo]);
}
k = trie[k].fail;
}
u = trie[u].son[v];
}
}
string entityParser(string text) {
in* trie = (in*)malloc(sizeof(in) *128 );
memset(trie, 0, sizeof(in) * 128);
m["""]='\"';m["'"]='\'';m["&"]='&';m[">"]='>';m["<"]='<';m["⁄"]='/';
for(auto mm:m){
insert(mm.first,trie);
}
getFail(trie);
query(text,text.size(),trie);
return ans;
}
};