HDU 2222 AC自动机
来源:互联网 发布:macbook怎样删除软件 编辑:程序博客网 时间:2024/05/22 14:09
题意:给出多组模式串,再给出一个母串,问多少模式串是母串的字串。
裸AC自动机题,来试模板的。
#include <iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<queue>using namespace std;char key[55],des[1000005];const int MAX_NODE = 1000005;const int SIGMA_SIZE = 26;int size;struct node{ node* fail; node* next[SIGMA_SIZE]; int count; void init() { fail=NULL; count=0; memset(next, 0, sizeof(next)); }};class AC_Automation{public: void init(); void insert(char* str); void getFail(); int find(char* str);private: node* new_node(); node Heap[MAX_NODE]; node* root; int size;};node* AC_Automation::new_node(){ Heap[size].init(); return &Heap[size++];}void AC_Automation::init(){ size=0; root=new_node();}void AC_Automation::insert(char* str){ node* p=root; for( ; *str; ++str) { int ch=*str-'a'; if(p->next[ch]==NULL) p->next[ch] = new_node(); p=p->next[ch]; } ++p->count;}void AC_Automation::getFail(){ queue<node*>Q; Q.push(root); while(!Q.empty()) { node* tmp=Q.front(); Q.pop(); node* p; for(int i=0; i<SIGMA_SIZE; ++i) { node*& now=tmp->next[i]; if(now != NULL) { Q.push(now); if(tmp==root) { now->fail=root; continue; } p = tmp->fail; while(p != NULL) { if(p->next[i] != NULL) { now->fail = p->next[i]; break; } p=p->fail; } if(p==NULL) now->fail=root; } else { if(tmp==root) now=root; else now=tmp->fail->next[i]; } } }}int AC_Automation::find(char* str){ node* p=root; int cnt=0; for( ; *str; ++str) { char ch=*str-'a'; p = p->next[ch]; if(p==NULL) p=root; node* tmp=p; while(tmp!=root && tmp->count!=-1) { cnt += tmp->count; tmp->count=-1; tmp=tmp->fail; } } return cnt;}AC_Automation ac;int main(){ int n,t; scanf("%d",&t); while(t--) { scanf("%d",&n); ac.init(); for(int i=0; i<n; i++) scanf("%s",key),ac.insert(key); ac.getFail(); scanf("%s",des); printf("%d\n",ac.find(des)); } return 0;}
- AC自动机 hdu 2222
- HDU 2222(AC 自动机)
- hdu 2222 AC自动机
- HDU 2222 AC自动机
- Hdu 2222 [AC自动机]
- hdu 2222 AC自动机 。。
- hdu 2222 AC自动机
- hdu 2222 ac自动机
- hdu 2222 AC自动机
- HDU 2222 AC自动机
- HDU 2222 AC自动机
- hdu 2222 ac自动机
- hdu 2222 AC自动机
- ac自动机 hdu 2222
- hdu 2222 AC自动机
- hdu 2222 ac自动机
- hdu 2222 AC自动机
- HDU 2222 AC自动机
- hdu 4651 Partition,公式题,维基百科上搜五边形定理即可
- libgdx引擎图片整合工具TexturePacker-Gui的使用注意事项
- DM6446开发攻略:UBOOT-2009.03移植及nand flash烧写
- java平台下通过jacob对excel,word进行打印等操作
- 认识smack中的基本对象-IQ
- HDU 2222 AC自动机
- 浅拷贝、深拷贝 Bitwise Copy和Memberwise Copy
- ASCII码表
- Android开源项目之Music (二)--- AIDL实现IPC进程间通讯
- Java 程序员在写 SQL 时常犯的 10 个错误
- MVC简单Demo
- mac 下的 xampp用php读取mysql数据 中文字符出现乱码
- 将ubuntu左上角的关闭按钮设置到右上角
- android_aidl知识介绍