hdu2222&hdu3065 AC自动机模板题
来源:互联网 发布:淘宝大学电商运营pdf 编辑:程序博客网 时间:2024/06/02 08:25
不贴链接了
裸题 主要想练习模板
hdu2222:求目标串中出现了几个模式串。(不重复)
hdu3065:求目标串中出现了几个模式串。(可重复)
hdu2222:
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<queue>using namespace std;const int N=1000005;const int M=500005;struct AhoCorasick{ int f[N],cnt[N]; int ch[M][26]; int sz,ans; queue<int>q; void init(){ sz=0;ans=0; memset(f,0,sizeof(f)); memset(ch,0,sizeof(ch)); memset(cnt,0,sizeof(cnt)); } int idx(char c){return c-'a';} void insert(char *ss){ int u=0; for(int i=0;ss[i];i++){ int c=idx(ss[i]); if(!ch[u][c]) ch[u][c]=++sz; u=ch[u][c]; } cnt[u]++; } void getfail(){ for(int i=0;i<26;i++) if(ch[0][i]) q.push(ch[0][i]); while(!q.empty()){ int r=q.front();q.pop(); for(int i=0;i<26;i++){ int u=ch[r][i]; if(!u){ch[r][i]=ch[f[r]][i];continue;} q.push(u); int v=f[r]; while(v && !ch[v][i]) v=f[v]; f[u]=ch[v][i]; } } } void find(char *s){ int j=0; for(int i=0;s[i];i++){ int c=idx(s[i]); j=ch[j][c]; int now=j; while(now!=0){ ans+=cnt[now]; cnt[now]=0; now=f[now]; } } } void print(){printf("%d\n",ans);} void debug(){ //for(int i=0;i<=sz;i++) printf("%d\n",cnt[i]); }};AhoCorasick ac;int T;char s[N];int main(){ freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); scanf("%d",&T); while(T--){ int n; scanf("%d\n",&n); ac.init(); char ss[100]; for(int i=1;i<=n;i++) scanf("%s\n",ss),ac.insert(ss); ac.getfail(); scanf("%s\n",s); ac.debug(); ac.find(s); ac.print(); } return 0;}
hdu3065
#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<map>using namespace std;const int N=1005,L=55,M=2000005;char a[N][L],x[M];struct AhoCorasick{ int f[N*L],last[N*L],val[N*L]; int ch[N*L][128]; int sz; map<string,int>ans; void init(){ memset(f,0,sizeof(f)); memset(last,0,sizeof(last)); memset(ch,0,sizeof(ch)); memset(val,0,sizeof(val)); ans.clear(); sz=0; } void insert(char *s,int k){ int u=0; for(int i=0;s[i];i++){ int c=s[i]; if(!ch[u][c]) ch[u][c]=++sz; u=ch[u][c]; } val[u]=k; } void getfail(){ queue<int>q; for(int i=0;i<128;i++) if(ch[0][i]) q.push(ch[0][i]); while(!q.empty()){ int r=q.front();q.pop(); for(int i=0;i<128;i++){ int u=ch[r][i]; if(!u){ch[r][i]=ch[f[r]][i];continue;} q.push(u); int v=f[r]; while(v && !ch[v][i]) v=f[v]; f[u]=ch[v][i]; last[u]=val[f[u]]?f[u]:last[f[u]]; } } } void find(char *s){ int j=0; for(int i=0;s[i];i++){ int c=s[i]; j=ch[j][c]; int now=j; while(now!=0){ if(val[now]) ans[(string)a[val[now]]]++; now=last[now]; } } } void print(int n){ for(int i=1;i<=n;i++) if(ans[(string)a[i]]) printf("%s: %d\n",a[i],ans[(string)a[i]]); }};AhoCorasick ac;int n;int main(){ freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); while(~scanf("%d\n",&n)){ ac.init(); for(int i=1;i<=n;i++) { scanf("%s\n",a[i]); ac.insert(a[i],i); } ac.getfail(); scanf("%s\n",x); ac.find(x); ac.print(n); } return 0;}
0 0
- hdu2222&hdu3065 AC自动机模板题
- hdu2222 ac自动机模板题
- 【AC自动机】hdu2222 hdu2896 hdu3065 zoj3430 poj2778
- AC自动机模板 hdu2222
- hdu2222 ac自动机模板
- HDU2222 AC自动机模板
- AC自动机模板 hdu2222
- hdu2222 ac自动机模板
- ac自动机模板hdu2222
- HDU2222 Keywords Search AC自动机模板题
- HDU2222 Keywords Search(AC自动机模板题)
- hdu2222 Keywords Search(AC自动机模板题)
- HDU2222 Keywords Search 【AC自动机模板题】
- AC自动机模板(hdu2222)
- ac自动机模板(hdu2222)
- ac自动机模板(hdu2222)
- HDU2222 AC自动机 入门模板
- 【AC自动机】hdu2222 hdu2896 hdu3065 zoj3430 poj2778 hdu2243
- 《Android源码设计模式》读书笔记 (4) 第4章 原型模式
- 活动对象demo_me
- poj1273
- 个人笔记 html 07 textarea 限制字数
- 学习IM软件开发
- hdu2222&hdu3065 AC自动机模板题
- 【Java】Java中this关键字的几种用法
- 个人笔记 js 16 js删除表格行
- C++ map的基本操作和使用
- cookie、localstroage与sessionstroage的一些优缺点
- 个人笔记 js 17 IE7不支持document.getElementById解决办法
- Angular中service、factory与provider的区别
- 数据类型
- N!