博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2222 Keywords Search(ac自动机)
阅读量:5126 次
发布时间:2019-06-13

本文共 2089 字,大约阅读时间需要 6 分钟。

题目链接 

题意:给你一系列子串,再给你一个主串问你主串一共有几个匹配子串

原来使用字典树写的但数据有点大TLE了,然后就开始学习ac自动机了,ac自动机就像是多串匹配的kmp原理也是类似的。

这题可以练一下手写ac自动机模版。

 

#include 
#include
#include
#include
using namespace std;const int M = 5e5 + 50;int Next[M][26] , fail[M] , End[M] , root , L , cnt;char str[60] , sl[M * 2];int newnode() { for(int i = 0 ; i < 26 ; i++) { Next[L][i] = -1; } End[L++] = 0; return L - 1;}void init() { L = 0; root = newnode();}void build(char s[]) { int len = strlen(s); int now = root; for(int i = 0 ; i < len ; i++) { int id = s[i] - 'a'; if(Next[now][id] == -1) { Next[now][id] = newnode(); } now = Next[now][id]; } ++End[now];}void get_fail() { queue
q; fail[root] = root; for(int i = 0 ; i < 26 ; 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 < 26 ; 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]); } } }}void match(char s[]) { int now = root; int len = strlen(s); for(int i = 0 ; i < len ; i++) { int id = s[i] - 'a'; now = Next[now][id]; int temp = now; while(temp != root) { cnt += End[temp]; End[temp] = 0; temp = fail[temp]; } }}int main(){ int t; scanf("%d" , &t); while(t--) { int n; scanf("%d" , &n); init(); for(int i = 0 ; i < n ; i++) { scanf("%s" , str); build(str); } get_fail(); scanf("%s" , sl); cnt = 0; match(sl); printf("%d\n" , cnt); } return 0;}

转载于:https://www.cnblogs.com/TnT2333333/p/6080469.html

你可能感兴趣的文章
腾讯元对象存储之文件删除
查看>>
jdk环境变量配置
查看>>
安装 Express
查看>>
包含列的索引:SQL Server索引的阶梯级别5
查看>>
myeclipse插件安装
查看>>
浙江省第十二届省赛 Beauty of Array(思维题)
查看>>
NOIP2013 提高组 Day1
查看>>
cocos2dx 3.x simpleAudioEngine 长音效被众多短音效打断问题
查看>>
存储(硬件方面的一些基本术语)
查看>>
观察者模式
查看>>
Weka中数据挖掘与机器学习系列之基本概念(三)
查看>>
Win磁盘MBR转换为GUID
查看>>
大家在做.NET B/S项目的时候多用什么设技术啊?
查看>>
Java SE和Java EE应用的性能调优
查看>>
Android设计模式系列--原型模式
查看>>
免费的论文查重网站
查看>>
C语言程序第一次作业
查看>>
leetcode-Sort List
查看>>
中文词频统计
查看>>
了解node.js
查看>>