CI20 8 多模式串匹配問題

2021-06-17 14:51:24 字數 1423 閱讀 4927

給定乙個目標串串t和若干個模式串p,設計乙個演算法去匹配每乙個模式串。

思路:多模式串匹配問題(設m為目標串的長度,n為模式串的平均長度)。可以用字尾trie樹,時間複雜度為o(m^2 + kn)。利用ac自動機的時間複雜度為o(m + kn + z)(其中z為t中出現的模式串個數)。還可以用字尾樹,字尾樹的方法比較複雜,這裡不做介紹。

下面是字尾trie樹的**

陣列形式:

#include #include #include using namespace std;

class trie

} void insert(const string& s) }

bool search(const string& s)

return true;

}};void main()

樹的形式:

#include #include #include #include using namespace std;

const int cld = 26;

struct tnode

};void insert(tnode*& root, const string& s)

temp = temp->pcld[j]; }}

bool search(tnode* root, const string& s)

return true;

}void main()

vectorsvec;

svec.push_back("is");

svec.push_back("sip");

svec.push_back("hi");

svec.push_back("sis");

svec.push_back("mississippa");

for (int i = 0; i < 5; ++i)

cout << search(root, svec[i]) << endl;

}

以下是ac自動機**:

#include #include #include #include #include using namespace std;

const int cld = 26;

struct tnode

};void insert(tnode*& root, const string& s)

temp = temp->pcld[j];

} temp->tag = true;

}void build(tnode*& root) }}

int search(tnode* root, const string& s) }

return res;

}void main()

模式串匹配問題

問題描述 給出模式串p和文字串t 有以下問題 1 模式串是否出現在文字串。2 文字串中出現模式串的所有位置。3 模式串在文字串出現的次數。暫時想不出那麼多 對於上述的每個問題都可以逐個字元比較來找出答案。如下 for int i 0 i 顯然上述演算法的時間複雜度是o n m 對於k個模式串問題時,...

AC 自動機 多模式串匹配

上的敏感詞過濾是怎麼實現的呢?實際上,這些功能最基本的原理就是字串匹配演算法,也就是通過維護乙個敏感詞的字典,當使用者輸入一段文字內容後,通過字串匹配演算法來檢查使用者輸入的內容是否包含敏感詞。bf rk bm kmp 演算法都是針對只有乙個模式串的字串匹配演算法,而要實現乙個高效能的敏感詞過濾系統...

AC自動機(多模式串匹配)

虛線部分代表fail指標 ac自動機模板題鏈結 靜態陣列版本 推薦 量少易寫,更快易寫 include using namespace std class aho corasick 儲存結構 trie樹 void insert const char str cnt p void build fail...