免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Trie樹的實現(xiàn)

Trie樹的實現(xiàn) Trie樹是保存字符串公共前綴信息的數(shù)據(jù)結(jié)構(gòu),可用于字符串多模匹配普通的非壓縮Trie樹實現(xiàn)如下第一種實現(xiàn):每個分支節(jié)點使用map標準庫容器保存前綴索引#include map #include stack #include vector #include string #include iostream #include random using namespace std; enum Compare_Result {EQUAL, LEFT_IS_PREFIX, RIGHT_IS_PREFIX, NOT_EQUAL}; struct TrieTreeNode //Trie樹節(jié)點類型 { enum NodeType { DATANODE, BRANCHNODE } type_flag; //節(jié)點類型標志分支節(jié)點或存放關(guān)鍵字的葉節(jié)點 union { string key_in_trie; //葉節(jié)點關(guān)鍵字 mapchar, TrieTreeNode* sub_ptr; //分支節(jié)點的分支字符和對應(yīng)的指向分支字符對應(yīng)的子節(jié)點的指針之間的映射關(guān)系 }; TrieTreeNode(const string k) :type_flag(NodeType::DATANODE), key_in_trie(k) {} TrieTreeNode() :type_flag(NodeType::BRANCHNODE), sub_ptr() {} TrieTreeNode(TrieTreeNode be_copied) { switch (be_copied.type_flag) { case NodeType::DATANODE: new (key_in_trie) string(be_copied.key_in_trie); break; case NodeType::BRANCHNODE: { new (sub_ptr) mapchar, TrieTreeNode*(); for (mapchar, TrieTreeNode*::iterator p be_copied.sub_ptr.begin(); p ! be_copied.sub_ptr.end(); p) sub_ptr.insert(make_pair(p-first, nullptr)); } break; } type_flag be_copied.type_flag; } ~TrieTreeNode() { switch (type_flag) { case NodeType::DATANODE: key_in_trie.~string(); break; case NodeType::BRANCHNODE: sub_ptr.~mapchar, TrieTreeNode*(); break; } } }; class TrieTree { public: bool insert(const string be_inserted) const; //Trie樹中插入關(guān)鍵字,true成功false失敗 bool deleteElem(const string be_deleted) const; //Trie樹中刪除指定關(guān)鍵字,true成功false失敗 TrieTreeNode* copy(); //拷貝Trie樹返回指向副本Trie樹的指針 TrieTree() { root new TrieTreeNode(); } void printTrieTree(TrieTreeNode* cur, size_t offset) const; bool isEmpty() const { return root-sub_ptr.empty(); } TrieTreeNode* getTrieTree() const { return root; } TrieTree(TrieTree be_copied) { root be_copied.copy(); } ~TrieTree(); private: Compare_Result static strCompare(const string left, const string right, string::size_type i); TrieTreeNode* root; //Trie樹根節(jié)點 }; ostream operator(ostream o, const TrieTree be_output) { if (be_output.isEmpty()) { o NULL endl; return o; } be_output.printTrieTree(be_output.getTrieTree(), 0); return o; } Compare_Result TrieTree::strCompare(const string left, const string right, string::size_type i) { for (; ; i) { if (i left.size() i right.size()) return Compare_Result::EQUAL; else if (i left.size() || i right.size()) { if (i left.size()) return Compare_Result::LEFT_IS_PREFIX; else return Compare_Result::RIGHT_IS_PREFIX; } else if (left[i] ! right[i]) return Compare_Result::NOT_EQUAL; } } bool TrieTree::deleteElem(const string be_deleted) const { TrieTreeNode* run root; vectorTrieTreeNode* stack; vectorTrieTreeNode*::size_type index; mapchar, TrieTreeNode*::iterator stop_branch_node; mapchar, TrieTreeNode*::iterator leaf_father_point_to_leaf; { string::size_type i 0; while (true) { if (i be_deleted.size()) { mapchar, TrieTreeNode*::iterator it; it run-sub_ptr.find(be_deleted[i]); if (it run-sub_ptr.end()) return false; i; if (run root || run-sub_ptr.size() 2) { if (it-second-type_flag TrieTreeNode::NodeType::BRANCHNODE) { index stack.size(); stop_branch_node it; } else { leaf_father_point_to_leaf it; break; } } else stack.push_back(run); run it-second; } else { if (run-sub_ptr.empty() || \0 ! run-sub_ptr.begin()-first) return false; leaf_father_point_to_leaf run-sub_ptr.begin(); break; } } if (leaf_father_point_to_leaf-first ! \0 strCompare(be_deleted, leaf_father_point_to_leaf-second-key_in_trie, i) ! Compare_Result::EQUAL) return false; } delete leaf_father_point_to_leaf-second; run-sub_ptr.erase(leaf_father_point_to_leaf); if (run ! root run-sub_ptr.size() 1 run-sub_ptr.begin()-second-type_flag TrieTreeNode::NodeType::DATANODE) { if (stop_branch_node-second ! run) { for (size_t j stack.size() - 1; j index; --j) delete stack[j]; delete stack[index]; } stop_branch_node-second run-sub_ptr.begin()-second; delete run; } return true; } bool TrieTree::insert(const string be_inserted) const { TrieTreeNode* run root; string::size_type i 0; pairmapchar, TrieTreeNode*::iterator, bool result; while (run-type_flag ! TrieTreeNode::NodeType::DATANODE) { if (i be_inserted.size()) { result run-sub_ptr.insert(make_pair(be_inserted[i], new TrieTreeNode(be_inserted))); if (result.second) return true; run result.first-second; i; } else { if (run-sub_ptr.empty() || run-sub_ptr.begin()-first ! \0) { run-sub_ptr.insert(make_pair(\0, new TrieTreeNode(be_inserted))); return true; } return false; } } Compare_Result compare_result; { string::size_type start_index i; compare_result strCompare(be_inserted, run-key_in_trie, i); if (compare_result Compare_Result::EQUAL) return false; result.first-second new TrieTreeNode(); for (; start_index i; start_index) result.first result.first-second-sub_ptr.insert(make_pair(be_inserted[start_index], new TrieTreeNode())).first; } if (compare_result Compare_Result::LEFT_IS_PREFIX) { result.first-second-sub_ptr.insert(make_pair(\0, new TrieTreeNode(be_inserted))); result.first-second-sub_ptr.insert(make_pair(run-key_in_trie[i], run)); } else if (compare_result Compare_Result::RIGHT_IS_PREFIX) { result.first-second-sub_ptr.insert(make_pair(\0, run)); result.first-second-sub_ptr.insert(make_pair(be_inserted[i], new TrieTreeNode(be_inserted))); } else { result.first-second-sub_ptr.insert(make_pair(run-key_in_trie[i], run)); result.first-second-sub_ptr.insert(make_pair(be_inserted[i], new TrieTreeNode(be_inserted))); } return true; } TrieTree::~TrieTree() { TrieTreeNode* run root; stackpairTrieTreeNode*, mapchar, TrieTreeNode*::iterator work_stack; bool trace_back_flag true; while (true) { if (trace_back_flag true) { if (run root) { if (run-sub_ptr.begin() run-sub_ptr.end()) { delete root; return; } } else { if (run-type_flag TrieTreeNode::DATANODE) { delete run; run work_stack.top().first; work_stack.top().second; //work_stack.top().second run-sub_ptr.erase(work_stack.top().second); trace_back_flag false; continue; } } work_stack.push(make_pair(run, run-sub_ptr.begin())); run run-sub_ptr.begin()-second; } else { if (run root || work_stack.top().second ! run-sub_ptr.end()) { if (run root) { if (work_stack.top().second root-sub_ptr.end()) { delete root; return; } } run work_stack.top().second-second; trace_back_flag true; } else { delete run; work_stack.pop(); run work_stack.top().first; work_stack.top().second; // work_stack.top().second run-sub_ptr.erase(work_stack.top().second); } } } } TrieTreeNode* TrieTree::copy() { TrieTreeNode* be_copied root; stackpairTrieTreeNode*, mapchar, TrieTreeNode*::iterator work_stack; stackpairTrieTreeNode*, mapchar, TrieTreeNode*::iterator copy_trace_stack; TrieTreeNode* root_of_copy nullptr; bool trace_back_flag true; while (true) { if (trace_back_flag true) { if (be_copied root) { root_of_copy new TrieTreeNode(*be_copied); if (be_copied-sub_ptr.begin() be_copied-sub_ptr.end()) break; copy_trace_stack.push(make_pair(root_of_copy, root_of_copy-sub_ptr.begin())); } else { if (work_stack.top().second ! work_stack.top().first-sub_ptr.begin()) copy_trace_stack.top().second; copy_trace_stack.top().second-second new TrieTreeNode(*be_copied); if (be_copied-type_flag ! TrieTreeNode::DATANODE) copy_trace_stack.push(make_pair(copy_trace_stack.top().second-second, copy_trace_stack.top().second-second-sub_ptr.begin())); else { be_copied work_stack.top().first; trace_back_flag false; continue; } } work_stack.push(make_pair(be_copied, be_copied-sub_ptr.begin())); be_copied be_copied-sub_ptr.begin()-second; } else { if (work_stack.top().second-second-type_flag ! TrieTreeNode::DATANODE) copy_trace_stack.pop(); if (be_copied root || (work_stack.top().second) ! be_copied-sub_ptr.end()) { if (be_copied root) { if ((work_stack.top().second) root-sub_ptr.end()) break; } be_copied work_stack.top().second-second; trace_back_flag true; } else { work_stack.pop(); be_copied work_stack.top().first; } } } return root_of_copy; } void TrieTree::printTrieTree(TrieTreeNode* cur, size_t offset) const { if (cur-type_flag TrieTreeNode::BRANCHNODE) { size_t max_length; if (cur-sub_ptr.begin()-first \0) max_length 4; else max_length 1; for (mapchar, TrieTreeNode*::iterator run cur-sub_ptr.begin(); run ! cur-sub_ptr.end(); run) { for (size_t go 1; go offset; go) cout ; if (run-first \0) cout NULL; else { cout run-first; for (size_t go 2; go max_length; go) cout ; } cout |- endl; printTrieTree(run-second, offset 2 max_length); } } else { for (size_t go 1; go offset; go) cout ; cout leaf: cur-key_in_trie endl; } } int main() { vectorstring test { bluebird, bunting, bobwhite, bluejay }; TrieTree test_obj; for (vectorstring::iterator p test.begin(); p ! test.end(); p) { cout 插入字符串 *p endl; if (test_obj.insert(*p)) { cout 插入成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 插入失敗 endl; exit(0); } } cout endl; // TrieTreeNode *copy test_ptr.copy(); //for (vectorstring::iterator p test.begin(); p ! test.end(); p) { cout 刪除字符串 bobwhite endl; if (test_obj.deleteElem(bobwhite)) { cout 刪除成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 刪除失敗 endl; exit(0); } cout 刪除字符串 bluejay endl; if (test_obj.deleteElem(bluejay)) { cout 刪除成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 刪除失敗 endl; exit(0); } } cout endl; string mod abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789; const int L 9; // 隨機字符串最大長度 const int r 2; //相同長度重復(fù)次數(shù) vectorint LList(L); vectorstring random_str; for (int run 0; run LList.size(); run) LList[run] run 1; shuffle(LList.begin(), LList.end(), default_random_engine()); for (int re 1; re r; re) { for (int run 0; run LList.size(); run) { string r; for (int go 1; go LList[run]; go) { r.append(1, mod[rand() % mod.size()]); } random_str.push_back(r); } } for (vectorstring::iterator p random_str.begin(); p ! random_str.end(); p) { cout 插入字符串 *p endl; if (test_obj.insert(*p)) { cout 插入成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 插入失敗 endl; exit(0); } } cout endl; // TrieTreeNode *copy test_ptr.copy(); for (vectorstring::iterator p random_str.begin(); p ! random_str.end(); p) { cout 刪除字符串 *p endl; if (test_obj.deleteElem(*p)) { cout 刪除成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 刪除失敗 endl; exit(0); } } cout endl; random_str.clear(); for (int i 1; i 7; i) { string temp(mod, 0, i); for (int run 1; run 7; run) { string r; for (int go 1; go run; go) { r.append(1, mod[rand() % mod.size()]); } random_str.push_back(temp r); } } cout 測試字符串有共同前綴不相等情形 endl; for (vectorstring::iterator p random_str.begin(); p ! random_str.end(); p) { cout 插入字符串 *p endl; if (test_obj.insert(*p)) { cout 插入成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 插入失敗 endl; exit(0); } } cout endl; // TrieTreeNode *copy test_ptr.copy(); for (vectorstring::iterator p random_str.begin(); p ! random_str.end(); p) { cout 刪除字符串 *p endl; if (test_obj.deleteElem(*p)) { cout 刪除成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 刪除失敗 endl; exit(0); } } cout endl; shuffle(mod.begin(), mod.end(), default_random_engine()); for (string::size_type i 1; i mod.size(); i) { string temp(mod, 0, i); cout 插入字符串 mod 的前綴 temp endl; if (test_obj.insert(temp)) { cout 插入成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 插入失敗 endl; exit(0); } } for (string::size_type i 1; i mod.size(); i) { string temp(mod, 0, i); cout 刪除字符串 mod 的前綴 temp endl; if (test_obj.deleteElem(temp)) { cout 刪除成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 刪除失敗 endl; exit(0); } } return 0; }第二種實現(xiàn)分支節(jié)點使用數(shù)組保存前綴的索引#include map #include stack #include vector #include string #include iostream #include random #include tuple using namespace std; enum Compare_Result { EQUAL, LEFT_IS_PREFIX, RIGHT_IS_PREFIX, NOT_EQUAL }; struct TrieTreeNode //Trie樹節(jié)點類型 { enum NodeType { DATANODE, BRANCHNODE } type_flag; //節(jié)點類型標志分支節(jié)點或存放關(guān)鍵字的葉節(jié)點 struct BranchNode { vectorTrieTreeNode* sub_ptr; size_t num; BranchNode() :sub_ptr(128, nullptr), num(0){} BranchNode(const BranchNode B) :num(B.num), sub_ptr(128, nullptr) {} }; union { string key_in_trie; //葉節(jié)點關(guān)鍵字 BranchNode branch_ptr; //分支節(jié)點的分支字符和對應(yīng)的指向分支字符對應(yīng)的子節(jié)點的指針之間的映射關(guān)系 }; TrieTreeNode(const string k) :type_flag(NodeType::DATANODE), key_in_trie(k) {} TrieTreeNode() :type_flag(NodeType::BRANCHNODE), branch_ptr() {} TrieTreeNode(TrieTreeNode be_copied) { switch (be_copied.type_flag) { case NodeType::DATANODE:{ new (key_in_trie) string(be_copied.key_in_trie); break; } case NodeType::BRANCHNODE:{ new (branch_ptr) BranchNode(be_copied.branch_ptr); break; } } type_flag be_copied.type_flag; } ~TrieTreeNode() { switch (type_flag) { case NodeType::DATANODE: key_in_trie.~string(); break; case NodeType::BRANCHNODE: branch_ptr.~BranchNode(); break; } } }; class TrieTree { public: bool insert(const string be_inserted) const; //Trie樹中插入關(guān)鍵字,true成功false失敗 bool deleteElem(const string be_deleted) const; //Trie樹中刪除指定關(guān)鍵字,true成功false失敗 TrieTreeNode* copy(); //拷貝Trie樹返回指向副本Trie樹的指針 TrieTree() { root new TrieTreeNode(); } TrieTree(TrieTree be_copied) { root be_copied.copy(); } void printTrieTree(TrieTreeNode* cur, size_t offset) const; bool isEmpty() const { return root-branch_ptr.num 0; } TrieTreeNode* getTrieTree() const { return root; } ~TrieTree(); private: template typename T Compare_Result static strCompare(const string left, const string right, T i); static size_t char_to_index(const char ch) { return ch; } TrieTreeNode* root; //Trie樹根節(jié)點 }; ostream operator(ostream o, const TrieTree be_output) { if (be_output.isEmpty()) { o NULL endl; return o; } be_output.printTrieTree(be_output.getTrieTree(), 0); return o; } template typename T Compare_Result TrieTree::strCompare(const string left, const string right, T i) { for (; ; i) { if (i left.size() i right.size()) return Compare_Result::EQUAL; else if (i left.size() || i right.size()) { if (i left.size()) return Compare_Result::LEFT_IS_PREFIX; else return Compare_Result::RIGHT_IS_PREFIX; } else if (left[i] ! right[i]) return Compare_Result::NOT_EQUAL; } } bool TrieTree::deleteElem(const string be_deleted) const { TrieTreeNode* run root; stackTrieTreeNode* work_stack; size_t index; { string::size_type i 0; while (run-type_flag TrieTreeNode::NodeType::BRANCHNODE) { if (i be_deleted.size()) { index char_to_index(be_deleted[i]); if (run-branch_ptr.sub_ptr[index] nullptr) return false; i; work_stack.push(run); run run-branch_ptr.sub_ptr[index]; } else { if (run-branch_ptr.sub_ptr[0] nullptr) return false; work_stack.push(run); run run-branch_ptr.sub_ptr[0]; index 0; } } if (run ! work_stack.top()-branch_ptr.sub_ptr[0] strCompare(be_deleted, run-key_in_trie, i) ! Compare_Result::EQUAL) return false; } work_stack.top()-branch_ptr.sub_ptr[index] nullptr; delete run; --work_stack.top()-branch_ptr.num; if (work_stack.top() ! root work_stack.top()-branch_ptr.num 1) { for (index 0; index work_stack.top()-branch_ptr.sub_ptr.size(); index) { if (work_stack.top()-branch_ptr.sub_ptr[index] ! nullptr) break; } if (work_stack.top()-branch_ptr.sub_ptr[index]-type_flag TrieTreeNode::NodeType::DATANODE) { run work_stack.top()-branch_ptr.sub_ptr[index]; delete work_stack.top(); work_stack.pop(); while (work_stack.top() ! root) { if (work_stack.top()-branch_ptr.num 2) { work_stack.top()-branch_ptr.sub_ptr[char_to_index(be_deleted[work_stack.size() - 1])] run; return true; } else { delete work_stack.top(); work_stack.pop(); } } work_stack.top()-branch_ptr.sub_ptr[char_to_index(be_deleted[0])] run; } } return true; } bool TrieTree::insert(const string be_inserted) const { TrieTreeNode* run root; string::size_type i 0; size_t index; TrieTreeNode* father_of_leaf nullptr; while (run-type_flag ! TrieTreeNode::NodeType::DATANODE) { if (i be_inserted.size()) { index char_to_index(be_inserted[i]); if (run-branch_ptr.sub_ptr[index] nullptr) { run-branch_ptr.sub_ptr[index] new TrieTreeNode(be_inserted); run-branch_ptr.num; return true; } father_of_leaf run; run run-branch_ptr.sub_ptr[index]; i; } else { if (run-branch_ptr.sub_ptr[0] nullptr) { run-branch_ptr.sub_ptr[0] new TrieTreeNode(be_inserted); run-branch_ptr.num; return true; } return false; } } Compare_Result compare_result; { string::size_type start_index i; compare_result strComparestring::size_type (be_inserted, run-key_in_trie, i); if (compare_result Compare_Result::EQUAL) return false; father_of_leaf father_of_leaf-branch_ptr.sub_ptr[index] new TrieTreeNode(); for (; start_index i; start_index) { father_of_leaf-branch_ptr.num 1; father_of_leaf father_of_leaf-branch_ptr.sub_ptr[char_to_index(be_inserted[start_index])] new TrieTreeNode(); } } if (compare_result Compare_Result::LEFT_IS_PREFIX) { father_of_leaf-branch_ptr.sub_ptr[0] new TrieTreeNode(be_inserted); father_of_leaf-branch_ptr.sub_ptr[char_to_index(run-key_in_trie[i])] run; } else if (compare_result Compare_Result::RIGHT_IS_PREFIX) { father_of_leaf-branch_ptr.sub_ptr[0] run; father_of_leaf-branch_ptr.sub_ptr[char_to_index(be_inserted[i])] new TrieTreeNode(be_inserted); } else { father_of_leaf-branch_ptr.sub_ptr[char_to_index(run-key_in_trie[i])] run; father_of_leaf-branch_ptr.sub_ptr[char_to_index(be_inserted[i])] new TrieTreeNode(be_inserted); } father_of_leaf-branch_ptr.num 2; return true; } size_t find_next(TrieTreeNode* cur, size_t run) { for (; run cur-branch_ptr.sub_ptr.size(); run) { if (cur-branch_ptr.sub_ptr[run] ! nullptr) return run; } } TrieTree::~TrieTree() { TrieTreeNode* run root; stacktupleTrieTreeNode*, size_t, short work_stack; bool trace_back_flag true; while (true) { if (trace_back_flag true) { if (run root) { if (run-branch_ptr.num 0) { delete root; return; } } else { if (run-type_flag TrieTreeNode::DATANODE) { delete run; run get0(work_stack.top()); if (run-branch_ptr.num ! get2(work_stack.top())) get1(work_stack.top()) find_next(run, get1(work_stack.top()) 1); trace_back_flag false; continue; } } work_stack.push(make_tuple(run, find_next(run, 0), 1)); run run-branch_ptr.sub_ptr[get1(work_stack.top())]; } else { if (run root || get2(work_stack.top()) ! run-branch_ptr.num) { if (run root) { if (get2(work_stack.top()) root-branch_ptr.num) { delete root; return; } } get2(work_stack.top()); run run-branch_ptr.sub_ptr[get1(work_stack.top())]; trace_back_flag true; } else { delete run; work_stack.pop(); run get0(work_stack.top()); if (run-branch_ptr.num ! get2(work_stack.top())) get1(work_stack.top()) find_next(run, get1(work_stack.top()) 1); } } } } TrieTreeNode* TrieTree::copy() { TrieTreeNode* be_copied root; stacktupleTrieTreeNode*, size_t, short work_stack; stackTrieTreeNode* copy_trace_stack; TrieTreeNode* root_of_copy nullptr; bool trace_back_flag true; while (true) { if (trace_back_flag) { if (be_copied-type_flag TrieTreeNode::BRANCHNODE) { if (be_copied root) { root_of_copy new TrieTreeNode(*be_copied); if (be_copied-branch_ptr.num 0) { break; } copy_trace_stack.push(root_of_copy); } else copy_trace_stack.push(copy_trace_stack.top()-branch_ptr.sub_ptr[get1(work_stack.top())] new TrieTreeNode(*be_copied)); work_stack.push(make_tuple(be_copied, find_next(be_copied, 0), 1)); be_copied be_copied-branch_ptr.sub_ptr[get1(work_stack.top())]; } else { copy_trace_stack.top()-branch_ptr.sub_ptr[get1(work_stack.top())] new TrieTreeNode(*be_copied); be_copied get0(work_stack.top()); trace_back_flag false; } } else { if (be_copied-branch_ptr.num ! get2(work_stack.top())) { get1(work_stack.top()) find_next(be_copied, get1(work_stack.top()) 1); get2(work_stack.top()); be_copied be_copied-branch_ptr.sub_ptr[get1(work_stack.top())]; trace_back_flag true; } else { if (be_copied root) break; work_stack.pop(); be_copied get0(work_stack.top()); copy_trace_stack.pop(); } } } return root_of_copy; } void TrieTree::printTrieTree(TrieTreeNode* cur, size_t offset) const { if (cur-type_flag TrieTreeNode::BRANCHNODE) { size_t max_length; if (cur-branch_ptr.sub_ptr[0] ! nullptr) max_length 4; else max_length 1; int count 0; for (size_t run 0; ; run) { if (cur-branch_ptr.sub_ptr[run] ! nullptr) { count; for (size_t go 1; go offset; go) cout ; if (run 0) cout NULL; else { cout static_castchar(run); for (size_t go 2; go max_length; go) cout ; } cout |- endl; printTrieTree(cur-branch_ptr.sub_ptr[run], offset max_length 2); if (count cur-branch_ptr.num) break; } } } else { for (size_t go 1; go offset; go) cout ; cout leaf: cur-key_in_trie endl; } } int main() { vectorstring test { bluebird, bunting, bobwhite, bluejay }; TrieTree test_obj; for (vectorstring::iterator p test.begin(); p ! test.end(); p) { cout 插入字符串 *p endl; if (test_obj.insert(*p)) { cout 插入成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 插入失敗 endl; exit(0); } } cout endl; // TrieTreeNode *copy test_ptr.copy(); //for (vectorstring::iterator p test.begin(); p ! test.end(); p) { cout 刪除字符串 bobwhite endl; if (test_obj.deleteElem(bobwhite)) { cout 刪除成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 刪除失敗 endl; exit(0); } cout 刪除字符串 bluejay endl; if (test_obj.deleteElem(bluejay)) { cout 刪除成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 刪除失敗 endl; exit(0); } } cout endl; string mod abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789; const int L 9; // 隨機字符串最大長度 const int r 2; //相同長度重復(fù)次數(shù) vectorint LList(L); vectorstring random_str; for (int run 0; run LList.size(); run) LList[run] run 1; shuffle(LList.begin(), LList.end(), default_random_engine()); for (int re 1; re r; re) { for (int run 0; run LList.size(); run) { string r; for (int go 1; go LList[run]; go) { r.append(1, mod[rand() % mod.size()]); } random_str.push_back(r); } } for (vectorstring::iterator p random_str.begin(); p ! random_str.end(); p) { cout 插入字符串 *p endl; if (test_obj.insert(*p)) { cout 插入成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 插入失敗 endl; exit(0); } } cout endl; // TrieTreeNode *copy test_ptr.copy(); for (vectorstring::iterator p random_str.begin(); p ! random_str.end(); p) { cout 刪除字符串 *p endl; if (test_obj.deleteElem(*p)) { cout 刪除成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 刪除失敗 endl; exit(0); } } cout endl; random_str.clear(); for (int i 1; i 7; i) { string temp(mod, 0, i); for (int run 1; run 7; run) { string r; for (int go 1; go run; go) { r.append(1, mod[rand() % mod.size()]); } random_str.push_back(temp r); } } cout 測試字符串有共同前綴不相等情形 endl; for (vectorstring::iterator p random_str.begin(); p ! random_str.end(); p) { cout 插入字符串 *p endl; if (test_obj.insert(*p)) { cout 插入成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 插入失敗 endl; exit(0); } } cout endl; // TrieTreeNode *copy test_ptr.copy(); for (vectorstring::iterator p random_str.begin(); p ! random_str.end(); p) { cout 刪除字符串 *p endl; if (test_obj.deleteElem(*p)) { cout 刪除成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 刪除失敗 endl; exit(0); } } cout endl; shuffle(mod.begin(), mod.end(), default_random_engine()); for (string::size_type i 1; i mod.size(); i) { string temp(mod, 0, i); cout 插入字符串 mod 的前綴 temp endl; if (test_obj.insert(temp)) { cout 插入成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 插入失敗 endl; exit(0); } } for (string::size_type i 1; i mod.size(); i) { string temp(mod, 0, i); cout 刪除字符串 mod 的前綴 temp endl; if (test_obj.deleteElem(temp)) { cout 刪除成功 endl; cout 當前Trie為: endl test_obj endl; TrieTree copy(test_obj); cout 當前Trie的副本為: endl copy endl; } else { cout 刪除失敗 endl; exit(0); } } return 0; }每種實現(xiàn)應(yīng)該都能適用于空串的插入刪除自己沒有驗證過感興趣可自行驗證
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久色激情| 九九成人| 久热最新视频| 大香蕉综合在线| 伊人婷婷大香蕉在线| av在线免费网站 | 丁香五月手机在线| 色色色色综合| 日韩在线aaa| 久久 婷婷 五月天| 精品99在线| 婷婷五月丁香五月基地| 欧亚成人A片一区二区| 99热这| 久久综合激情| 97色在线观看视频| 五月丁香最新| 丁香五月天社区婷婷| 直接看的AV| se99视频| 另类激情网| 五月丁香激情婷婷综合字幕| 99精品视频在线免费观看| 九草性爱| 五月激情婷婷国产精品久久久久久| 综合色久| 免费视频WWW在线观看网站| 丁香五月婷婷综合精品素人| 丁香五月婷婷五月天| 欧美天天干五月丁香| 91肏| 97在线精品视频| 九九精品婷| 中文字幕无码人妻少妇免费视频| 激情婷婷丁香| 日本4399天堂中出| 婷婷色网址| 风流少妇A片一区二区蜜桃| 中文字幕在线播放视频| 香蕉综合网| 99热精品免费| 九九99免费视频| 99免费| 五月天久久婷婷| 激情 婷婷 插| 五月天亭亭俺也| 九九热视频免费的| 色五月中文网| 91久久婷婷| 噜噜狠狠色综合久| www.五月天婷婷| 99精品久久| 激情五月丁香社区| 91色婷婷综合久久中文字幕二区| 亚洲精品无人区| 五月天丁香| 午夜天堂一区人妻| 丁香五月天婷婷大香蕉| 99色色| 182TV大香蕉| 91丨九色熟女丨首页| 五月丁了香蕉综合| 色婷婷99| 天天操天天爱天天玩| 天天射夜夜骑| 大香蕉网站,大香蕉综合| 婷婷五月天视频免费在线观看| 日韩精品二三区| 五月色天情| 国产成人亚洲综合A∨婷婷| 婷婷五月激情中文字幕| 五月天婷婷日日爱| 九九久久网| 国产亚洲99| 亚洲VA欧美VA| 这里只有精品免费观看网占| 色99在线视频| 亚洲欧洲另类图片| 六月丁香综合| 最新亚洲色色网| 26uuu国产激情视频| 五月婷婷亚洲| WWW.桔色成人.COM| 婷婷激情性爱| 狠狠五月激情婷婷直播片| 日日日影院| 99无码视频| 大香蕉久艹| 丁香婷婷久久| 丁香五月区| 丁香婷婷五月天亚洲| 婷婷激情五月综合丁香社| 综合激情视频| AⅤ网站在线看| 欧美人人女女精品综合五月天| 这里只有精品日韩| 伊人婷婷色| 欧洲色| 5月丁香综合图区| 中文字幕av在线播放| 开心五月六月婷婷| 五月婷婷综合久久| 丁J香六月首页| 9久热在线视频精品| 丁香五月老师| 六月激情综合| 色婷婷欧美| 26uuu亚洲色| A1片久久久| 噼里啪啦在线观看免费完整版视频| 色九九一二| 91欧美| 丁香五月婷婷色| 色五月丁香五月| 精品国产一区二区三区四区阿崩| 狠狠看狠狠| 婷婷丁香人妻天天爽| 丁香五月六月综合激情| 婷婷精品在线| 91无码视频| 久久婷婷七月丁香| www.五月天婷婷姐姐| 99热热这里只精品996小说| 五月天激情小说| 国产综合视频婷婷| 婷婷色啪| 在线网黄| 五月丁香久久网| 色五月开心久久网| 思思热AV| 五月亭亭色| 五丁香激情综合| 大香蕉啪啪| www99xxxx五月丁| 视频这里只有精品16| a在线观看| 久久人操-久草婷婷-成人AV| 婷婷五月婷婷| 久久精品99久久久久久| 色婷婷五月色| 91精品久久久久| 日本色视| 亚洲AV第二区国产精品| 五月丁香成人| 色丁香五月婷婷| 久久伊人9| 免费成片在线观看| 五月停停色色丁香| 九九热这里只有精品23| 婷婷色中文字幕| 另类专区在线| 噜噜在线| www,五月丁,com| 色五月网址| 热的五码久久精品| 免费无码毛片一区二区A片| 丁香婷婷六月婷婷六月婷婷六月婷婷| 色无码| 婷婷五月成人| 成人片黄网站色大片免费毛片| www.av视频xx999.com| 亚洲热久久| 97人人射| 亚洲综合网在线| 欧美激情xxxXX| 婷婷啪啪| 九九热在线99| 亚州色婷婷| 激情五月丁香五月| 欧美噜一噜| 俺来也狠狠| 韩国久久少妇视屏| 久久婷婷五月综合激情国产| 五月天激情网图片| 六月丁香社区| 久热99| 天天干天天插| 亚洲成人五月| 思思久久精品视频| av无码电影| 激情六月丁香| 五月天狠狠干| 丁香五月激情综合| 丁香五月熟女| 色九区| 午夜无码精品色综合久久| 97久久久久久久久久久| 激情五月婷| 九九热这里只有精品556| 99久久99九九99九九九| 色色色色综合| 丁香五月大片| 综激情网| 五月激情久久| 亚洲操操操| 五月天伊人综合| 一区二区成人电影| AV中文字幕夜夜操b天天摸bb | 99热99色| 99国产小视频免费观看| 色婷婷最新域名 | 碰超在线九色| 美国少妇性做爰| 婷婷五月综合网| 九九色中文| Www.sesese丁香| 天天综合 99久久婷婷| 激情综合啪啪啪| 成人AV播放| 中文字幕婷婷| 色色亚洲视频| 亚洲综合婷婷六月丁香五月| 99热在这里只有免费精品| 色级婷婷| 淫视馆av三区| 午夜不卡久久精品无码免费 | 91大神操美女| 色婷婷四色| 亚洲精品久久久久AV无码| 99热精品无码| 五月色丁香视频精品| 日本熟妇精品99| 色综合99色| 五月激情在线| 丁香五月婷婷网| 免费视频99| 就爱操www com| 色色色区| 99色在线观看视频| 激情久久 婷婷| 婷婷色色综合| 久久婷婷青青草| 亚洲色频| 99热最新网址| 丁香五月激情婷婷| 丁香五月激情五月| 欧美精品999| www.99热在线| 婷婷欧美激情综合| 99热综合网| 99亚洲无码| 蜜乳A√| 婷婷欧美偷拍综合| 久久久久久草黄色片AV在线观看| 人妻狠狠操| 91激情五月开心| 色在线免费观看| 伊人综合网站| 99久久婷婷国产综合精品| 色色婷| 色综合色色| 久久狠狠干| 99在线精品视频| 3www激情| 综合婷婷都市激情| 五月丁香六月激情综合| 99热在线精品观看| 99热9| 九九热在线精品视频| 玖玖资源在线视频| 风流少妇A片一区二区蜜桃 | 色亚洲婷婷| 色五月丁香一区在线| 日本本土色网第一区| 深爱激情中文五月天av| 婷婷五月色影视先锋| 综合综合色色| 五月丁香六月婷婷婷婷| 久久激情五月婷婷| 九色自拍| 久久精品99国产精品日本| 五月天激情小说| 色五月婷婷五月天| 久婷婷久草| 五月婷色丁香| 久色网址| 久久只这里有精品| 天天爱天天操| 91一起操| 日本少妇AA一级特黄大片| 五月丁香九九| 七七九九色色| 婷婷久久色| 天天插天天插| 亚洲乱码日产精品BD| 色99久草在线| 97自拍视频在线| 亚洲成色综合网站免费观看| 久久婷婷成人综合色怡春院| 女人天堂AV| 五月天sesese| AAA久久| 精品综合久久久久久五月天| 五月天天久久香| 丁香五月婷婷啪啪| 97伦色婷婷| 日本97在线视频| 色婷婷影视| 婷婷玉月丁香五月在线视频| 亭亭色网| 一区二区无码视频| 五月婷婷新网站| 婷婷五月色網站| 亚洲av免费在线| 99网| 国产免费AV网站| 五月丁香六月婷精品视频| 婷婷六月久久综合导航| 成人视频网| www.99热这里精品| 五月综合六月丁| 九月综合| 丁香深五月婷婷| 色综合久久天天综合网| 99热地址| 丁香五月-激情综合| 丁香五月婷婷欧美激情-中文天堂最新版在线观看 | www.操.com| 丁J香六月首页| 人人草成人视频| 99成人免费热视频| 97人妻超级碰碰碰碰碰| 热99精品视频在线观看| 久久99热这里只频精品6学生| 五月婷婷激情| 狠狠色丁香久久久婷| 婷婷五月美女直播| 九月丁香网婷婷| AV伊人青草丁香六月| 九九热在线视频观看| www.zbzhongsen.com| 九九超日本| 婷婷五月激情片| 高清无码视频网址| 色婷婷AAA| 吉澤明步Av一區二區| 五月天伊人| 三级三久久线久久99久目本WW| 欧美色五月天| 国产激情一区| 欧美激情综合色综合色| 91色性感五月婷婷丁香| 亚洲精品性色| 久久五月婷天天干| 婷婷五月天色综合| 欧美在线ee日韩| 天天爽日日搞| 亚洲无AV在线中文字幕 | 夜夜骑夜夜操| 亚洲色婷婷五月天| 五月丁香综合中文| www.五月天色色.com| 五月天涩涩| 久久婷青青草原| 丁香久久五月天视频在线观看| 久久色情| 丁香综合伊人AV| 免费观看18视频网站| 91日韩在线| 色情综合网| 五月激情视频| 天天做天天爱天天爽| 久久天天天| 开心激情五月天网| 深爱激情九九五月天 | 人人妻人人澡| 欧美日本综合网| 五月丁香啪啪网| 婷婷5月色| 在线另类| 日本成人小说婷婷六月| 97爱综合| 26uuu在线观看| 丁香婷婷精品视频| 97色精品视频| 五月婷婷丁香啪啪| 噜噜噜噜噜久| 99久久超级| 伊人五月成人| 99综合自拍| 亚洲欧美成人在线| AV 3P| 五月天婷婷青青草| 久99久在线观看| 五月婷婷黄色| 熟女少妇内射日韩亚洲| 天天色亚洲| WWW.99视频| 99热9| 99热在线里有精品| 五月天婷婷涩涩| 六月丁香av| 综合欧美五月婷婷| 99re在线免费视频| 五月婷婷影院| 中文AV网| 韩国情人在线电视剧免费观看高清版全集 | 欧洲99视频在线| 亚洲精品V天堂中文字幕| www.sezonghe| 亚洲啪视频| 五月网站| 五月天色综合| 成人九九视频| 99视频精品全部免费看| 另类图片五月天激情| 久热一本| 亚洲五月色| 66精品国产成人| 日韩啪啪视品| 色色99| 99精品视频免费| 日韩色色色色色| 大香蕉视频99| 亚洲午夜AV| 婷婷五月天在线一区| 久色网| 亚州精品成人片| 综合婷婷| 色五月天激情| 夜夜躁爽日日| 丁香五月亚洲婷婷| 天天操夜夜啊| 99网址在线看| www.99免费视频| 97碰碰碰免费公开在线视频| 色欲丁香| 色综合天天| 天天夜天天色天天| 婷婷激情五月天在线视频| 人妻激情视频| 99久热在线精品99re6热| 97人人超| 五月丁香天堂网| 丁香五月天论坛| 深爱激情网婷婷| 国产日比| 色狠狠综合| 精品99在线观看| 婷婷婷婷婷婷婷婷婷婷丁香| 婷婷综合六月| 色婷婷亚洲综合网站| 色5月婷婷| 五月丁香自拍| 婷婷综合另类| 狠狠爱丁香婷| 碰超亚洲| 久久色六月| 99久久久久| 九色视频91| 六月婷婷激情| 五月激情网站| 色五月天激情| 日韩999| 亚洲人人操| 色欲一二三| 丁香婷婷婷五月| 91综合视频丁香| 国产精品A成V人在线播放| 99这里只有精品视频| 丁香九月综合激情| 久久女婷| 99精品久久| 五月婷婷久久久| 五月丁香色综合| 婷婷五月天视频免费在线观看| 色色色色色色色色色色色色色色,网站| 婷婷色天香| 人人添人人| 激情丁香五月激情婷婷| 五月天婷网| 日韩欧美骚货| 中文av网| 欧洲毛片基地c区| 在线另类| 免费看欧美成人A片无码| 久久99网站| 亚洲国产精品VA在线看黑人| 91在线97视频| www.99日本| 狼人婷婷久久| 777精品久无码人妻蜜桃| 色人久久| 亚洲色区17| 97干在线看| 99热综合在线| 这里只有精品,日韩视频| 色小说婷婷五月天天天| 五月丁香六月婷婷的女人| 色欲色香综合网| 婷婷操久久| 婷婷亚洲综合| 丝袜熟女一区二区三区| 五月天婷婷基地综合网| 精品无码色| 五月天色婷婷网| 色婷婷精品视频| 操人无码| 五月激情综合婷婷| 婷婷成人综合| 99性感视频| 亚洲综合99| 五月丁香| 丁香五月激情五月| 九月丁香婷婷| AV五月婷婷露脸| 九九九九国产| 婷婷丁香六月天激情四射网| 婷婷综合五月| 中文乱子伦视频| 丁香五月91| 欧美A级成人婬片免费看理论| 无码一级片| 高清无码.com| 丁香五月天堂网| 伊人99热| 久久九九@| 五月婷婷黄色视频| 天天狠狠夜夜狠狠2023| www.com任你艹| 丁香五月天信号| www色五月| 狠狠精品干练久久久无码中文字幕| 任我肏视频精品| 五月丁香日本片| 激情五月婷婷在线观看| 国产欧美性成人精品午夜| 9久久网| 天天网站天天爽| 丁香婷婷色情| 91传媒无码人妻精| 婷婷五月天.com| 丁香婷婷五月六月久久| 九九成年视频| 中国AV性爱观看| 婷婷五月色| 九九热99在线视频| 五月婷婷手机在线| 五月天社区| 九色PORNY自拍成人精彩视频| 丁香五月婷婷天| 色人久久| 天搞天天天天天| 色九亚洲| www.婷婷,com| 色99视频| 十区av| av性爱在线| 久久人妻熟女一区二区| 综合五月草| 人人操日| 91人人爽狠狠狠| 久久丁香五月天| 丁香五月亚洲综合| 丁香五月婷婷俺也要去| 久草x色在线观看99 | 丁香色五月 97干| 婷婷九月亚洲| 丁香五月欧美激情| 97精品欧美91久久久久久久| 91操在线视频| 91碰| 久热只有精品| 婷婷久久五月| 香蕉AV福利精品导航| 五月天亚洲图片婷婷| 久久亚洲婷婷| 久久视屏这里只有久久| 99激情视频| 六月丁香激情综合网| 成人国产综合| 99re热精品视频国| 第九色区av天堂| 久久视频婷婷视频| 不卡在线中文字幕无| 天天成人综合| 四色五月婷婷| 超碰国产在线观看| 97人妻碰碰碰久| 五月天激情四射| 欧美日本VA| 超碰在线国产| 影音先锋 婷婷| 99re视频在线精品| 色婷久久| 五月天亚洲图片婷婷| 天天干天天爽| 丁香五月 六月婷婷首页| 无码碰碰| 天天综合五月天| 91丨九色丨国产打屁股| 少妇人妻人伦A片| 伊人色综在线| 国产精品视频免费看| 天天色综网| 婷婷丁香成人在线视频| 99久久婷婷综合| 香蕉人在线香蕉人在线 | 午夜亚洲国产精品av一区二区| 婷婷五月天精品| 综合色天天| 91精品久| 色色性爱视频| 天天爽日日爽夜夜爽| 日本三级毛片| 狠狠综合网| 亚洲色情在线| 亚洲色色色色色色色色色| 色伦专区97中文字幕| 伊人AV五月婷| 五月丁香久久精品在线观看 | 婷婷色五月噜噜| 99天天操夜夜操| 久久婷婷五月综合伊人| 五月天婷婷色播在线网| 五月丁香六月综合基地| 五月丁香亭亭电影久久| 色五月综合| 我要射综合| 超碰人人超碰| tingtingseav| 亚洲精品亚洲人成人网| 99激情视频| 婷婷色五月亚洲| 91无码高清| 无码免费人妻A片AAA毛片西瓜| 激情五月天com| 五月婷婷狠天天色综合| 日韩在线视频网站| 丁香九色不卡aaa| www.色综合| 深爱五月天| 天天色天天噜| 五月天激情综合首页| 欧美成人日韩| AV片在线观看| 青青青在线视频国产| 精品99在线| 五月天激情视频网站| 色五月综合婷婷久久综合婷婷久久综合婷婷久久综合婷婷久久 | 91久久婷婷| 五月天婷婷激情在线色图| 欧美久久五月婷婷| 91丨九色丨东北熟女| 97操碰人人| 7777国产盗摄农村女人| 丁香久久| 成人在线99| 五月丁香激| 九九热99热| 人人做人人看人人摸| 色婷婷成人丁香| www.99热在线观看| 天天干天天曰天天射| 日韩AC在线免费观看| 2018国产大陆天天弄| 丁香五月性爱| 亚洲AV成人精品日韩在线播放| 色婷婷狠狠| 婷婷五月天另类网站| 夜夜爽日日躁| 森林影视大全,最好看的2019年视频 | 激情五月婷婷丁香| 婷婷的99视频网站| 亚洲综合五月天婷婷丁香| 26UUU精品一区二区| 亚洲欧美另类在线23p| 五月丁香六月激情综合在线| 久久久婷丁香五月| 2025天天爽天天摸| 99久久婷婷五月天| 婷婷精品性性性性性性性| 日韩久久这里只有精品| 婷婷五月色丁香在线看| 激情五月,深深爱五月| Va另类视频| 亚洲国产成人裸舞| 激情婷婷啪啪| 能看的av| 五月丁香综合啪啪| 99热这里精品| 成人视频网| 国产伦亲子伦亲子视频观看| 激情五月天。| 色欧美日| 99ri国产| 五月婷婷天天色| 99色看| 婷婷五月色播放| 五月狠狠| 日日撸夜夜操| 伊人久久大香线蕉精品| 极品五月天| 91久久综合亚洲噜噜成人在线| 亚洲小电影在线观看黄999| 黄色成人网站在线播放| ss五月天激情| 亚洲 六月 综合| 99这里有精品| 久久色情| 97干资源在线观看| 人妻九九九九| 五月丁香激情婷婷综合字幕| 五月天精品视频| 久久久久亚洲AV无码网影音先锋| 婷婷五月天福利| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 婷婷91视频| 99色在线视频观看| 91欧美| 色综合性视频| 色99热| 99国产精品久久久久久久久久久| 亚洲a片免费观看| 啪啪丁香五月| 五月天婷婷丁香视频| 婷婷六月综合激情| 午夜丁香| 99九九中文字幕视频| 人妻久久做| www,天天干| 六月激情综合| 玖玖综合玖玖| 五月天无码视屏播放| 五月婷婷在线视频| 性做久久久久久久免费看| 黄页免费一级视频懂色| 99这里只有精品视频在线| 97色色色色色| 亚州美女| 超碰chaompinm| 情婷婷五月天| 亚洲操操| 五月久久婷婷丁香| 九九精品在线观看视频6| 六月丁香啪啪| 99丁香五月婷婷在线| 天堂爱爱| 色九九综合| 99碰在线视频| 色婷婷丁香中文在线播放| 色婷婷丁香| 国产婷婷久久| 色综合久久88色综合中文字幕| 色播六月| 99久久.www| 夜夜操狠狠操天天操| 婷婷五月色播放| 久久久久久久久久久月丁| 天天干天天干天天干天天干天天干天天 | 九九热这里只有精品7| 99热久| 依人大香蕉在钱1| 激情深爱婷婷网| 9久视频| 9热在线观看| 思思热久热| 日韩欧美成人一区二区三区| 丁香六月中文| 五月丁香狠狠爱| 99精品在线| 婷婷久久五月丁香| 亚洲天堂啪啪| 日本一级一片免费视频| 99九精品| 天天影院色| 99热大| 999热在线视频| 97人碰人操| 天天干天天操天天上| 99国产精品久久久久久久久久久 | 五月天在线视频尤物视频在线看| 国产精品99久久久久久久女警| 五月婷婷另类| 五月丁香综合网| 九九久久精品| 色色99| 日本的α片xxxwww| 亚洲色色色| 99热20| 国产AV一区二区三区日韩| 華人性愛AV在線| 中文字幕在线日亚州9| 久久久久久久五月婷婷六月丁香综合,开心激情综合网 | 大胆伊人久久| 五月婷婷九九热| 国产精品美女| 丁香五月久久| 色五月xxx| 国色天香成人网| 五月色婷婷AV| 丁香五月天影院| 六月丁香五月天| 日本99视频精品免费播放| 婷婷五月激情的图片| 欧美日韩成人免费在线| 六月综合婷婷开心伊人| 丁香六月av| 亚洲网站观看视频| 五月激情婷婷丁香| 91九色熟女| 丁香五月婷婷基地| 婷婷五月精品在线| 激情五月婷婷色色| 五月婷婷人人人操| 可以免费看av网站| 沈娜娜av| 99精品久久久| 丁香婷婷丁香五月欧美人| 久草婷婷网 | 伊人五月婷| 激情五月天网| 日本熟女视频一区二区| 欧美A级成人婬片免费看理论| 五月天成人小说网| 另类综合激情| 国产看真人毛片爱做A片| 丁香五月天的网址。| 亚洲成人中心| 国产做爰视频免费播放| 五月丁香黄色视频| 婷婷丁香五月综合| 激情九月婷婷九月| 五月婷婷中文字幕| 丁香花五月天| 99日逼视频| 成人做爰A片免费看视频| 亚洲天天综合| 丁香婷婷人妻| 精品视频网| 激情综合网五月天| 丁香六月婷婷激情| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 天天肏天天舔AV| 久操大香蕉| 天天日天天日天天搞| 99热在线精品观看| 中文字幕在线aⅴ免费观看| 婷婷六月色开 | 五月天激情四射网站| 91五月天| 9热精品| 婷婷狠狠五月综合| 九九99免费理论| 亚洲永远av在线播放| 丁香色婷婷五月天| 激情小说婷婷| 人妻肉射免费观看| 99婷婷| 1024亚洲| 六月丁花香啪啪激情欧美| 亚洲欧美综合7777色婷婷| 婷婷色成人| 激情五月天激情网| 美女黄频aⅴ视频| 内射 无码 伊人| 亚洲1区| 91婷婷搞| 久狠狠狠| 日操夜撸| 色情播放| 这里只有精9| 久久综合激情| 久9免费视频| 日韩小视频在线99| 五月天大香蕉av| www.色婷婷| 久久作爱| 日本色色网站| 性爱视频99| 九九热精品视频九九| 色播五月天天| 五月丁香色婷婷婷基地| 五月婷婷狠狠干| 色激情五月| 久热爱大香蕉在线蜜臀悦色 | 五月丁香婷婷欧美色图视频五月丁香777电影| 丁香六月在线| 在线色色| 成人丁香五月| 99日在线视频| 久婷婷婷| 91干| 99色在线视频| 狠狠色婷婷7777久| 婷婷激情综合| 久久五月婷| 99久在线精品99re8| 五月丁香欧美综合| 五月丁香久久久久| 大香蕉五月婷婷| 六月丁香啪啪啪| 久久婷婷网| 亚洲精品成人| 婷婷五月天激情四射| 99re思思热久久| 丁香五月六月综合激情| 婷婷五月天网| 色五月av| 99精彩视频网站在线| 激情5月婷婷| 亚洲黄色操逼| www.99热这里精品| 精典久久| 色很很96| 插插干干干色| 天天干天天叉| 99热这里只有精品99| 欧美日本黄色| 色99色| 丰满老熟妇BBBBB搡BBB| 色欲五月丁香| CAOBIBI| 涩综合网| 欧美精品久久久久久视频观看| 日韩狠狠色婷婷| 狠狠色噜噜狠狠狠888了| 婷婷五月花西瓜| 日日夜夜天天| 五月婷婷婷| 欧美顶级少妇做爰HD| 久久男人网婷婷| 丁香五月婷婷亚洲另类| 91人人操人人| 五月丁激情| 亚洲五月天婷婷| 色婷网| 97在线观视频免费观看| 夫妻超碰在线| 欧美色图天堂网| 夜夜操少妇| 天天婷婷综合亚洲亚洲| 天天干天天色综合| 99热8在线| 国产五月天婷婷| 开心五月丁香综合久久| 五月天另类小说| 五月丁香六月婷综合成人综合| 亚洲无AV在线中文字幕| 97色视频网| 六月婷婷五月丁香首页| 天天爽天天摸人妻综合网| 午夜一区| 亚韩精品视频1区| 丁香五月婷婷超碰在线| 六月丁香婷婷在线波多| 武则天精品久久| 激情网 久久| 久9热在线视频| 99热777| 色婷婷综合网| 狠狠 久久| 美臀自射自家人妻| 超碰在线综合| 丁香六月婷婷缴情欧美| 99九九综合久久九九| 色婷婷五月网| 婷婷99狠狠| 五月色亭丁香| 久热这里只有精品在线观看 | 午夜丁香 婷婷| 亚洲丁香五月天在线视频| 99这里有精品视频| 亚洲黄色网址| 97亚洲色 torrent magnet| 亚洲视频99| 99色爱| 五月丁香六月婷婷综合在线| 天天天干夜夜夜操| 丁香五月影| 综合激情啪啪| 成人网址在线观看| 激情丁香五月AV| 丁香五月人妻熟女| 免费精品99| 综合另类视频| 色综合久久五月天| 真实的国产乱XXXX在线91| 婷婷免费精品视频| 丁香激情久久| cao久久| 天天日天天爱天天噪| .精品久久久麻豆国产精品| 色综合色综合网| 欧美色频| 久久丁香九| 综合激情深爱| 久久精品无码一区| 婷婷五月情色| 中文字幕永久在线| 亚洲激情av| 女婷久久| 激情婷婷在线中文字幕| 97碰人人操| 久久香蕉婷婷| 色五月婷婷小说亚洲中文字幕组| 久久九九热re6这里有精品| 色五月丁香激情视频| 日日干日日| 五月天婷婷综合久久| 亚洲中文字幕网| 色色免费网站| 亚洲色碰| 91热99| 99欧美| wwwss在线观看| 91精品久久久久久77777| 日韩高清成人| 狠狠综合网| 婷婷五月激情综合| 99精品视频网站| 看婷婷五月天网| 久久99网| 五月婷婷激清网| 五月天丁香成人| 五月天婷婷永久免费视频| 2025天天操| www九九| 久久伊人五月天| 亚洲综合久| 亚洲精品亚洲人成人网| 色99色| 久久狼人天堂| AV在线观看网站| 香蕉视频91| 欧美中文五月天| 99自拍视频在线观看| 九九99热| 婷婷五月激情欧美| 天天噜噜| 99极品视频| 婷婷中合| 久久久免费精彩视频| 天天射天天干天插色综合| 日韩成人综合网| 美女丁香五月天| 射婷婷中文字幕| 日日夜夜天天综合| 色婷婷9| 五月丁香亭亭| 色婷婷在线视频综合| 五月婷丁香久久综合| 天天搞天天色综合| 久久婷婷五月综合97色一本| 天天综合精品| 亚洲色无码| 五月激情婷婷综合| 亚洲无码99| 五月天色婷婷成人| 99久久精品国产色欲| 婷婷五月六月| 色噜噜在线| 99视频在线播放大全| 桃色五月天| 五月激情六月宗合| 国产一级片| WW婷婷五月天com| 婷婷六月综合基地| 久久这里在精品视频| 丁香五月激情啪啪综合| 激情婷婷丁香五月天| 一本久久亚洲五月婷婷 | 久久机热思思热| 9l视频自拍9l九色9l成人| 91chinese在线| 日本五月婷婷| 婷婷四月 成人 狠狠干| 九九成年视频| 99久久综合网| 婷婷社区五月天| 天天爽夜夜爽夜夜爽精| www综合久久| 欧美大肥婆大肥BBBBB| 激情五月综合| 黄涩毛片| 99精品热视频| 91av成人| 婷婷在线视频| 亚洲免费观看高清完整版AV线| 色婷五月天亚洲| 一区二区免费看| 97超级碰人人| AV性爱网| 九九精品亚洲| 久久人妻高清中文| 天天玩夜夜操天天爽| 99碰碰中文| 97超碰免费超级在线观看| 中文字幕综合网| 99热亚洲精品| caopeng97日韩| 97色干| 婷婷玖玖丁香| 亚洲人操亚洲人| 99色色| 91热在线| 九九热精品在线| 丁香婷婷五月基地| 天天成人综合| 丁香五月综合高清在线| 五月丁香色婷婷色| 91色色色视频| 色婷婷性爱网| 第九色区av天堂| 九九久久网| 午夜成人网站在线观看| 五月婷婷之综合激情| 色色色色色色综合| 开心婷婷五月天电影院| 色,激情五月天| 丁香婷婷五月天激情四射| 欧美久人人| 综合久久综合五月天婷婷| 激情婷婷| 国产67194| 婷婷狠狠干| 久热九九| 婷婷伊人网| 久久92| www.日韩国产| 99啪啪网| 婷丁香五月天| 91九色中文| 丁香婷婷激情五月天无毒不卡蜜桃| 婷婷五月天另类网站| WWW激情五月天| 激情婷婷狠狠干| 6080av| 五月天综合区| 婷婷五月天激情综合深爱| 亚洲五月天综合| 丁香五月狠狠综合欧美| 五月丁香综合久久| 春色激情第四色| 五月丁香色婷| 99热色在线精品| 色五月丁香五月婷婷五月成人网| 五月中旬婷婷丁香六| 五月丁香花激情综合网| 婷婷色爱| 色婷婷五月天激情在线观看| 无码区婷婷五月花开| 久狠狠| 色婷婷免费视频| 激情色播| 99视频精品| 欧美大片免费观看| 久久久久久久91| 伊人丁香五月婷婷潮吹| 久xxxx| 成人国产综合| 天天色·欧美| 天天艹天天色| 色五月丁香伊人五月| 五月婷婷视频在线观看| 丁香五月中文字幕| 狠狠干综合| 婷婷五月在线影院| 亚洲成人无码片| 黄色五月婷婷| 狠狠88综合久久久久噜噜噜| 五月天色婷婷小说| 天天日日综合| 九九精品99| 偷偷与邻居做爰完整视频| 在线超碰免费| 婷婷九月亚洲| 青青草搞屄视频网站| 五月丁香婷在线| 天天肏天天肏天天肏| 91九色在线| 中文字幕成人版| 九九热精品99| 99re这里只有精品国产99| www.夜夜.com| 激情99热| 青草视频在线播放| 99久在线精品99re8| 五月丁香六月婷婷在线播放| 日本色色视频| 亚洲激情网| 五月婷婷香蕉视频| 色五月丁香六月欧美综合| 99热| 久久97| 久久99久久久| 99热这里只有精品国产免费| 丁香六月婷婷综合在线| 五月丁香婷婷综合久久| 最近中文字幕大全免费版在线 | 婷五月天| 性色播| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 久久久精品AV| 天天舔天天插天天干| 婷婷九月综合| 男人的天堂婷婷色五月| 中文字幕AV网址| 婷婷激情丁五月| 九月婷婷久久| 久久天堂女人| 五月丁香激情五月天| 五月天偷拍| 日本操B视频在线观看| 第五婷婷伊人丁香色| www,婷婷五月天,com| 九九香蕉网| 日韩精品无码AV| 啪啪干伊人婷婷| 丁香五月综合| 丁香五月97视频| 天天更新天天亚洲| 日本色色图| 亚洲国产另类av| 白天AV月月| AV操操操| 91精品人妻少妇无码影院| 91小黄书网址在线观看| 五月天激情婷婷| 日本97在线视频| 岛国AV网| 99热热热99精品丁香| 精品五月视频婷婷在线观看| 五月天婷婷丁香基地在线观看| 色色色色欧美| 再次出发二| 五月婷婷久久综合| 91视频久久久| 深爱激情网五月天| 国产黄大片在线观看画质优化 | 南京搡BBBB搡BBBB| 99热.com| 99爽视频| 九色无码| 色色五月丁香婷婷综合| 999热成人在线综合网| 国产小精品| 涩涩五月天综合| 99热精品无码| 久久色情| AV在线资源| 色婷婷五月综合在线| 美女天天爽| 激情五月天色色色| 婷婷五月天亚洲丁香| 精品一二三区久久AAA片| 77799热| 91丨九色丨东北熟女| 大香蕉久久久久| 五月丁香亭亭操逼| 精品99在线| 99资源在线视频| 精品99在线看| 五月天久久综合| 婷婷涩涩五月天| 99欧州偷拍视频| 97人人做| 久久综合中文| 九九色婷婷| 久久一热| 99免费热在线精品| 九九亚洲| 五月天性色| 亚洲天码视频www蛋播视频| 五月婷婷很很色| 五月婷天天搞视频|