1. 程式人生 > 實用技巧 >20.html替換------AC自動機

20.html替換------AC自動機

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["&quot;"]='\"';m["&apos;"]='\'';m["&amp;"]='&';m["&gt;"]='>';m["&lt;"]='<';m["&frasl;"]='/'; for(auto mm:m){ insert(mm.first,trie); } getFail(trie); query(text,text.size(),trie); return ans; } };