[kuangbin带你飞]专题17:A
来源:互联网 发布:所有香烟条形码数据库 编辑:程序博客网 时间:2024/06/05 16:53
AC自动机模版题
#include<iostream>#include<queue>#include<algorithm>#include<cmath>#include<cstdio>#include<string>#include<cstring>using namespace std;//可优化为数组形式struct node{ node* next[26]; node* fail; int value; node() { for(int i = 0; i < 26; i++) next[i] = NULL; fail = NULL; value = 0; }};node* root;queue<node*> q;void insert(string s) { int l =(int)s.length(); node* p = root; for(int i = 0; i < l; i++) { int id = s[i]-'a'; if(p->next[id] == NULL) p->next[id] = new node(); p = p->next[id]; } p->value++; //作为一个单词匹配的标记 }void setfail() { q.push(root); while(!q.empty()) { node* now = q.front(); q.pop();//取出下一个,出队 for(int i = 0 ; i < 26; i++) if(now->next[i]) {//节点存在,为它构建fail指针 node *p = now->fail; while(p && !p->next[i]) p = p->fail; //如果now为root,则fail为NULL now->next[i]->fail = p ? p->next[i] : root;//赋值 q.push(now->next[i]);//入队 } }}int ac(string s) { int l = (int)s.length(); node* now = root; int cnt = 0; for(int i = 0; i < l; i++) { int id = (int)(s[i] - 'a'); while(now && !now->next[id]) now = now->fail;//找到匹配的位置,//千万不能写反 now = now ? now->next[id] : root; for(node* p = now; p ; p= p->fail) if(p->value > 0) { cnt += p->value; p->value = 0; } } return cnt;}void clear(node* p) { for(int i = 0; i < 26; i++) if(p->next[i]) clear(p->next[i]); delete p;}int main() { //freopen("a.in", "r", stdin); ios::sync_with_stdio(false); int T; cin >> T; string s; while(T--) { //初始化 root = new node(); int N; cin >> N; while(N--) { cin >> s; insert(s); } cin >> s; setfail(); cout << ac(s) << endl; clear(root); } return 0;}
阅读全文
0 0
- [kuangbin带你飞]专题17:A
- [kuangbin带你飞]专题17:D
- [kuangbin带你飞]专题17:B
- [kuangbin带你飞]专题17:C
- [kuangbin带你飞]专题二 搜索进阶 A - Eight
- [kuangbin带你飞]专题一 简单搜索 A POJ1321
- [kuangbin带你飞]专题四 最短路练习 A
- [kuangbin带你飞]专题六 最小生成树A
- [kuangbin带你飞]专题八 生成树 A
- [kuangbin带你飞]专题二-搜索进阶-A-Eight
- [kuangbin带你飞]专题一 简单搜索 A
- [kuangbin带你飞]专题一 简单搜索 -A
- [kuangbin带你飞]专题十一 网络流 A POJ
- [kuangbin带你飞]专题九 连通图 A
- [kuangbin带你飞]专题四 最短路练习 A
- [kuangbin带你飞]专题一 简单搜索 A
- [kuangbin带你飞]专题七 线段树 A
- [kuangbin带你飞]专题十三 基础计算几何A
- LINTCODE——有效数字(待改进)
- [bzoj2096][Poi2010]Pilots(二分+单调队列)
- 35个Java代码性能优化总结
- 【Hibernate】数据库配置
- 计蒜客 Minimum Distance in a Star Graph 2017icpc南宁赛区 字符串bfs
- [kuangbin带你飞]专题17:A
- Prototype原型模式和深克隆
- 深入理解vue.js双向绑定的实现原理
- Linux 中模拟延时和丢包的实现
- bzoj 1570: [JSOI2008]Blue Mary的旅行 分层图网络流
- bzoj1212 [HNOI2004]L语言(AC+dp)
- 双向链表的小练习
- 创建maven-web项目eclipse 版本 Version: Oxygen Release
- 谈谈我的保研经历