20.html替換------AC自動機
阿新 • • 發佈:2020-07-27
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; } };