hdu2896-ac自动机
来源:互联网 发布:淘宝七乐康药店 假货 编辑:程序博客网 时间:2024/05/24 03:07
这个加入了记录编号
就是把原来的那个记录次数的改成记录标号
不要忘记每一次init
不要忘记build
不要忘记数组开的大小
直接查询的话,是不能保证按照原来顺序的,所以找到所有答案之后应该再排一下顺序
#include <iostream>#include <cstdio>#include <queue>#include <algorithm>#include <cstring>using namespace std;const int MAX=220*500;int cnt;struct Trie{ int next[MAX][128],fail[MAX],end[MAX],bh[MAX]; int root,L; int newnode() { for (int i=0;i<128;i++) next[L][i]=-1; end[L++]=0; return L-1; } void init() { L=0; cnt=0; memset(bh,0,sizeof(bh)); root=newnode(); } void insert(char *buf) { cnt++; int len=strlen(buf); int now=root; for (int i=0;i<len;i++) { if (next[now][buf[i]]==-1) next[now][buf[i]]=newnode(); now=next[now][buf[i]]; } bh[now]=cnt; end[now]++; } void build () { queue<int >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 query(char *buf) { int len=strlen(buf); int now=root; int res=0; for (int i=0;i<len;i++) { now=next[now][buf[i]]; int temp=now; while (temp!=root) { res+=end[temp]; //end[temp]=0; temp=fail[temp]; } } return res; } void query_(char *buf) { int len=strlen(buf); int ans[501]; int cn=0; int now=root; for (int i=0;i<len;i++) { now=next[now][buf[i]]; int temp=now; while (temp!=root) { if (bh[temp]) { cn++; ans[cn]=bh[temp]; } temp=fail[temp]; } } sort(ans+1,ans+cn+1); for (int i=1;i<=cn;i++) printf(" %d",ans[i]); }};char buf[10005];Trie ac;int main(){ int n,m; while (scanf("%d",&n)==1) { ac.init(); for (int i=0;i<n;i++) { scanf("%s",buf); ac.insert(buf); } cin>>m; ac.build(); int ans=0; for (int i=1;i<=m;i++) { scanf("%s",buf); if (ac.query(buf)) { ans++; printf("web %d:",i); ac.query_(buf); printf("\n"); } } printf("total: %d\n",ans); } return 0;}
0 0
- hdu2896 AC自动机
- hdu2896 AC自动机
- hdu2896之AC自动机
- hdu2896(ac自动机)
- hdu2896 AC自动机
- hdu2896 ac自动机
- hdu2896 & hdu3065 ac自动机
- hdu2896 AC自动机
- hdu2896-ac自动机
- hdu2896(AC自动机)
- hdu2896 AC自动机
- HDU2896【AC自动机-模板】
- HDU2896 AC自动机
- HDU2896-AC自动机
- 【AC自动机】 hdu2896 病毒侵袭
- 【hdu2896】【AC自动机】病毒侵袭
- HDU2896(病毒侵袭--AC自动机)
- hdu2896(AC自动机模板)
- 面向对象
- 继承关系中的虚函数表
- Linux 磁盘管理
- c++primer之顺序容器(容器库概览)
- apache开启虚拟主机方法
- hdu2896-ac自动机
- [网络流24题] 21 最长k可重区间集(最大权不相交路径 ,最小费用最大流)
- C语言排序实例(选择、冒泡、插入、折半、快速)
- java版 利用栈实现括号匹配
- CCF-最大的矩形-201312-3
- linux下sed和awk命令使用入门
- Java中Runnable和Thread的区别
- 白化
- 编码解码模型和实现