hdu2222ac自动机或者裸字典树
来源:互联网 发布:途虎软件下载 编辑:程序博客网 时间:2024/04/29 10:30
ac自动机代码
#include <cstdio>#include <iostream>#include <queue>#include <cstring>using namespace std;#define id(a) (a-'a')const int maxnode=10000*50+10;int ch[maxnode][26];int f[maxnode];int val[maxnode];int sz;int insert(char *s){ int u = 0; for(int i = 0;s[i];i++){ int c = id(s[i]); if(!ch[u][c]){ memset(ch[sz],0,sizeof(ch[sz])); val[sz] = 0; f[sz] = 0; ch[u][c] = sz++; } u = ch[u][c]; } val[u] ++;}int find_fail(){ int u = 0; queue<int> que; f[0]= 0; for(int i = 0;i < 26;i++){ int u = ch[0][i]; if(u){ f[u] = 0; que.push(u); } } while(!que.empty()){ int r = que.front(); que.pop(); for(int i = 0;i < 26;i++){ if(!ch[r][i]){ ch[r][i] = ch[f[r]][i]; } else{ f[ch[r][i]] = ch[f[r]][i]; que.push(ch[r][i]); } } }}int query(char *s){ int u = 0; int ans = 0; for(int i = 0;s[i];i++){ u = ch[u][id(s[i])]; int tmp = u; while(tmp){ ans += val[tmp] ; val[tmp] = 0; tmp = f[tmp]; } } printf("%d\n",ans); return ans;}char s[1000005];char a[100];int main(){ int t; cin >> t; while(t--){ int n; cin >> n; sz = 1; memset(ch[0],0,sizeof(ch[0])); val[0]= 0; f[0] =0; for(int i = 0;i < n;i++){ scanf("%s",a); insert(a); } find_fail(); scanf("%s",s); query(s); }}
裸trie代码
#include <cstdio>#include <iostream>#include <algorithm>#include <queue>#include <cmath>#include <cstring>#include <stack>#include <set>#include <map>#include <vector>using namespace std;#define INF 0x2fffffff#define LL long long#define MAX(a,b) ((a)>(b))?(a):(b)#define MIN(a,b) ((a)<(b))?(a):(b)#define id(a) ((a)-'a')const int maxnode = 10000*50+10;int ch[maxnode][26];int val[maxnode];int sz = 0;int insert(char *s){ int len =strlen(s); int u = 0; for(int i = 0;i < len;i++){ int c = id(s[i]); if(!ch[u][c]){ memset(ch[sz],0,sizeof(ch[sz])); val[sz] = 0; ch[u][c] = sz++; } u = ch[u][c]; } val[u] ++;}int query(char *s){ int ans = 0; for(int i = 0;s[i];i++){ int c = id(s[i]); int u = 0; int j = 0; while(ch[u][c]){ if(val[ch[u][c]]){ ans += val[ch[u][c]]; val[ch[u][c]] = 0; } u = ch[u][c]; j ++; c = id(s[i+j]); } } printf("%d\n",ans);}char s[1000005]; int main(){ int t; freopen("1.txt","r",stdin); freopen("2.txt","w",stdout); scanf("%d",&t); while(t--){ int n; scanf("%d",&n); char a[100]; memset(ch[0],0,sizeof(ch[0])); val[0]= 0; sz = 1; for(int i = 0;i < n;i++){ scanf("%s",a); insert(a); } scanf("%s",s); query(s); } return 0;}
裸字典树的时候只要了600多ms,写ac自动机却用了700多ms,而且开始的时候不知道哪里错了,一直wa,tle,re,mle,这哪里是ac自动机啊,分明是wa自动机,tle自动机,re自动机,mle自动机啊 !
0 0
- hdu2222ac自动机或者裸字典树
- hdu2222AC自动机
- hdu2222ac自动机入门
- 字典树+AC自动机
- 字典树 AC自动机
- 字典树+KMP+AC自动机
- poj2418map或者字典树
- hdu1251 hash或者字典树
- hdu1247 字典树或者hash
- HDU2896ac自动机版+可以改字典树
- HDU3724 AC自动机版改字典树
- 字典树模板/ac自动机模板
- hdu 5384 Danganronpa (字典树/AC自动机)
- AC自动机——1 Trie树(字典树)介绍
- (字典树+AC自动机) hdu 2222 Keywords Search
- poj 1816 字典树trie+自动机的理解
- HDU 2222 Keywords Search【AC自动机|字典树】
- 字典树+AC自动机Hyper Prefix SetsUVA11488YTACM第一周E
- [leetcode-60]Permutation Sequence(C)
- bootstrap charisma 入门学习笔记
- 数据手册中的full voltage range和limited voltage range
- java实现单链表
- Nginx配置文件nginx.conf中文详解
- hdu2222ac自动机或者裸字典树
- viewpager 自动无限循环 这段代码移到你的程序中就可以用了
- HDU - 2546 饭卡
- mac(一)
- Intent相关FLAG介绍和Activity启动模式
- UISwitch
- jQuery Cropper 使用说明
- JDK 和 JRE 概念
- hdu 2072 单词数