首页 > 代码库 > ac自动机
ac自动机
这个还是给个例子比较形象:
模式串:she,shr,her,say
目标串:yasherhs。出现了两个。
主要是fail指针求解。
1 #include<iostream> 2 #include<string> 3 #include<queue> 4 using namespace std; 5 6 7 8 9 struct trie{ 10 int count; 11 trie *fail; 12 trie *son[26]; 13 trie() 14 { 15 count=0; 16 fail=nullptr; 17 for(int i=0;i<26;i++) 18 son[i]=nullptr; 19 } 20 }; 21 queue<trie*> q; 22 trie *root; 23 24 string target; 25 26 int query() 27 { 28 int count=0; 29 trie* temp=root; 30 int len=target.length(); 31 for(int i=0;i<len;i++) 32 { 33 int pos=target[i]-‘a‘; 34 if(temp->son[pos]==nullptr) 35 { 36 while(temp->son[pos]==nullptr && temp!=root) 37 { 38 temp=temp->fail; 39 } 40 } 41 temp=temp->son[pos]; 42 if(temp==nullptr) 43 temp=root; 44 trie *p=temp; 45 while(p!=root && p->count!=-1) 46 { 47 count+=p->count; 48 p->count=-1; 49 p=p->fail; 50 } 51 } 52 return count; 53 54 } 55 56 57 void build_ac() 58 { 59 int start=0; 60 int end=0; 61 q.push(root); 62 while(!q.empty()) 63 { 64 trie *temp=q.front(); 65 q.pop(); 66 for(int i=0;i<26;i++) 67 { 68 if(temp->son[i]!=nullptr) 69 { 70 if(temp==root) 71 { 72 temp->son[i]->fail=root; 73 q.push(temp->son[i]); 74 continue; 75 } 76 trie *f_fail=temp->fail; 77 while(f_fail!=nullptr) 78 { 79 if(f_fail->son[i]!=nullptr) 80 { 81 temp->son[i]->fail=f_fail->son[i]; 82 break; 83 } 84 f_fail=f_fail->fail; 85 } 86 if(f_fail==nullptr) 87 temp->son[i]->fail=root; 88 q.push(temp->son[i]); 89 } 90 92 } 93 } 94 } 95 96 void insert(string str) 97 { 98 int len=str.length(); 99 trie *temp=root;100 for(int i=0;i<len;i++)101 {102 int pos=str[i]-‘a‘;103 if(temp->son[pos]==nullptr)104 temp->son[pos]=new trie();105 temp=temp->son[pos];106 }107 temp->count++; 108 109 }110 111 int main()112 {113 int n;114 cin>>n;115 root=new trie();116 for(int i=0;i<n;i++)117 {118 string str;119 cin>>str;120 insert(str);121 }122 build_ac();123 cin>>target;124 int ret=query();125 cout<<ret<<endl;126 }
ac自动机
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。