博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AC自动机 专题
阅读量:5040 次
发布时间:2019-06-12

本文共 4195 字,大约阅读时间需要 13 分钟。

1 // 求目标串中出现了几个模式串  2 //====================  3 #include 
4 #include
5 #include
6 #include
7 #include
8 using namespace std; 9 10 struct Trie 11 { 12 int next[500010][26],fail[500010],end[500010]; 13 int root,L; 14 int newnode() 15 { 16 for(int i = 0;i < 26;i++) 17 next[L][i] = -1; 18 end[L++] = 0; 19 return L-1; 20 } 21 void init() 22 { 23 L = 0; 24 root = newnode(); 25 } 26 void insert(char buf[]) 27 { 28 int len = strlen(buf); 29 int now = root; 30 for(int i = 0;i < len;i++) 31 { 32 if(next[now][buf[i]-'a'] == -1) 33 next[now][buf[i]-'a'] = newnode(); 34 now = next[now][buf[i]-'a']; 35 } 36 end[now]++; 37 } 38 void build() 39 { 40 queue
Q; 41 fail[root] = root; 42 for(int i = 0;i < 26;i++) 43 if(next[root][i] == -1) 44 next[root][i] = root; 45 else 46 { 47 fail[next[root][i]] = root; 48 Q.push(next[root][i]); 49 } 50 while( !Q.empty() ) 51 { 52 int now = Q.front(); 53 Q.pop(); 54 for(int i = 0;i < 26;i++) 55 if(next[now][i] == -1) 56 next[now][i] = next[fail[now]][i]; 57 else 58 { 59 fail[next[now][i]]=next[fail[now]][i]; 60 Q.push(next[now][i]); 61 } 62 } 63 } 64 int query(char buf[]) 65 { 66 int len = strlen(buf); 67 int now = root; 68 int res = 0; 69 for(int i = 0;i < len;i++) 70 { 71 now = next[now][buf[i]-'a']; 72 int temp = now; 73 while( temp != root ) 74 { 75 res += end[temp]; 76 end[temp] = 0; 77 temp = fail[temp]; 78 } 79 } 80 return res; 81 } 82 void debug() 83 { 84 for(int i = 0;i < L;i++) 85 { 86 printf("id = %3d,fail = %3d,end = %3d,chi = [",i,fail[i],end[i]); 87 for(int j = 0;j < 26;j++) 88 printf("%2d",next[i][j]); 89 printf("]\n"); 90 } 91 } 92 }; 93 char buf[1000010]; 94 Trie ac; 95 int main() 96 { 97 int T; 98 int n; 99 scanf("%d",&T);100 while( T-- )101 {102 scanf("%d",&n);103 ac.init();104 for(int i = 0;i < n;i++)105 {106 scanf("%s",buf);107 ac.insert(buf);108 }109 ac.build();110 scanf("%s",buf);111 printf("%d\n",ac.query(buf));112 }113 return 0;114 }
//输出每个模式串出现的次数#include 
#include
#include
#include
#include
using namespace std;char str[1010][100];struct Trie{ int next[1010*50][128],fail[1010*50],end[1010*50]; int root,L; int newnode() { for(int i = 0;i < 128;i++) next[L][i] = -1; end[L++] = -1; return L-1; } void init() { L = 0; root = newnode(); } void insert(char s[],int id) { int len = strlen(s); int now = root; for(int i = 0;i < len;i++) { if(next[now][s[i]] == -1) next[now][s[i]] = newnode(); now = next[now][s[i]]; } end[now] = id; } void build() { queue
Q; fail[root] = root; for(int i = 0;i < 128;i++) if(next[root][i] == -1) next[root][i] = root; else { fail[next[root][i]] = root; Q.push(next[root][i]); } while(!Q.empty()) { int now = Q.front(); Q.pop(); for(int i = 0;i < 128;i++) if(next[now][i] == -1) next[now][i]=next[fail[now]][i]; else { fail[next[now][i]]=next[fail[now]][i]; Q.push(next[now][i]); } } } int num[1010]; void query(char buf[],int n) { for(int i = 0;i < n;i++) num[i] = 0; int len=strlen(buf); int now=root; for(int i=0;i
< n;i++) if(num[i] > 0) printf("%s: %d\n",str[i],num[i]); }};char buf[2000010];Trie ac;void debug(){ for (int i = 0; i < ac.L; i++) { printf("id = %3d ,fail = %3d ,end = %3d, chi = [",i,ac.fail[i],ac.end[i]); for (int j = 0; j < 128; j++) printf("%2d ",ac.next[i][j]); printf("]\n"); }}int main(){// freopen("in.txt","r",stdin);// freopen("out.txt","w",stdout); int n; while(scanf("%d",&n) == 1) { ac.init(); for(int i = 0;i < n;i++) { scanf("%s",str[i]); ac.insert(str[i],i); } ac.build(); scanf("%s",buf); ac.query(buf,n); } return 0;}

转自bin神 orz

转载于:https://www.cnblogs.com/tsw123/p/4449203.html

你可能感兴趣的文章
返回顶部(动画)
查看>>
webpack+react+antd 单页面应用实例
查看>>
Confluence 6 SQL Server 数据库驱动修改
查看>>
Confluence 6 通过 SSL 或 HTTPS 运行 - 备注和问题解决
查看>>
【47.76%】【Round #380B】Spotlights
查看>>
Git(使用码云)
查看>>
分享Java web 开发必游之路
查看>>
IIS初始化(预加载),解决第一次访问慢,程序池被回收问题(转载)
查看>>
Bean的Scope
查看>>
【BZOJ】3142: [Hnoi2013]数列
查看>>
http初探
查看>>
elasticsearch的安装
查看>>
__next__()
查看>>
爬取:中国大学排名
查看>>
聊天室(C++客户端+Pyhton服务器)_1.框架搭设
查看>>
UpdatePanel 内控件 更新“外的”控件【转】
查看>>
mybatis中&gt;=和&lt;=的实现方式
查看>>
Python面向对象03/继承
查看>>
java序列化和反序列化
查看>>
绝对定位
查看>>