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;
    }
};

 

posted @ 2020-07-27 15:23  阿破  阅读(124)  评论(0)    收藏  举报