博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2846 (AC自动机+多文本匹配)
阅读量:5880 次
发布时间:2019-06-19

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

题目链接:

题目大意:有多个文本,多个模式串。问每个模式串中,有多少个文本?(匹配可重复)

解题思路

传统AC自动机是计算单个文本中,模式串出现次数。

这里比较特殊,每个文本需要单独计算,而且每个匹配在每个文本中只能计数1次。

比如add,d只能计数1次,而不是;两次。

所以循环逐个对文本Find。每个Find里,进行Hash,保证每个匹配串只计数1次。

由于匹配串可重复,在Insert之前,也需要离散化Hash一下,把重复的下标,指向最先插入的下标。

另外,本题会卡掉不正确AC自动机模板( Find里要写成While(last!=root)而不是While(last->cnt)  )

代码

#pragma comment(linker, "/STACK:1024000000,1024000000")#include "cstdio"#include "cstring"#include "string"#include "iostream"#include "queue"#include "vector"#include "algorithm"#include "map"using namespace std;#define maxn 26int ans[100005],mt[100005];string P[10005];struct Trie{    Trie *next[maxn],*fail;    int cnt;}*root;Trie *newnode(){    Trie *ret=new Trie;    memset(ret->next,0,sizeof(ret->next));    ret->fail=0;    ret->cnt=0;    return ret;}void init() {root=newnode();}void Insert(string str,int index){    Trie *pos=root;    for(int i=0;i
next[c]) pos->next[c]=newnode(); pos=pos->next[c]; } pos->cnt=index;}void getfail(){ queue
Q; for(int c=0;c
next[c]) { root->next[c]->fail=root; Q.push(root->next[c]); } else root->next[c]=root; } while(!Q.empty()) { Trie *x=Q.front();Q.pop(); for(int c=0;c
next[c]) { x->next[c]->fail=x->fail->next[c]; Q.push(x->next[c]); } else x->next[c]=x->fail->next[c]; } }}void Find(string str){ map
Hash; Trie *pos=root,*last; for(int i=0;i
maxn) {pos=root;continue;} if(pos->next[c]) { pos=pos->next[c]; last=pos; while(last!=root) { if(!Hash.count(last->cnt)) { ans[last->cnt]++; Hash[last->cnt]++; } last=last->fail; } } }}int main(){ //freopen("in.txt","r",stdin); ios::sync_with_stdio(false); int n,m,s; string tmp; while(cin>>n) { map
ms; memset(ans,0,sizeof(ans)); memset(mt,0,sizeof(mt)); init(); for(int i=1;i<=n;i++) cin>>P[i]; cin>>s; for(int i=1;i<=s;i++) { cin>>tmp; if(!ms.count(tmp)) { Insert(tmp,i); ms[tmp]=i; mt[i]=i; } else mt[i]=ms[tmp]; } getfail(); for(int i=1;i<=n;i++) Find(P[i]); for(int i=1;i<=s;i++) cout<
<

 

 

转载地址:http://oqdix.baihongyu.com/

你可能感兴趣的文章
云计算时代 未来CRM系统发展趋势
查看>>
让开发自动化:除掉构建脚本中的气味
查看>>
新一代服务器性能测试工具Gatling
查看>>
Google 将于4月25日关闭 Hangouts API
查看>>
中国程序员 VS 美国程序员,差距就在这五点
查看>>
《R与Hadoop大数据分析实战》一导读
查看>>
IESG 批准 HTTP 法律审查状态代码 451
查看>>
《仿人机器人原理与实战》一2.6 行为链搜索关键词
查看>>
《驯狮记——Mac OS X 10.8 Mountain Lion使用手册》——1 走进Mac OS世界 1.1 Mac OS X的沿革...
查看>>
《嵌入式 Linux C 语言应用程序设计(修订版)》——1.1 嵌入式系统概述
查看>>
作为一个新手程序员该如何成长?
查看>>
《C语言编程魔法书:基于C11标准》——1.6 本章小结
查看>>
芬兰诺基亚欲投靠Android 但需等到2016年
查看>>
第十四天:规划质量管理,一致性成本、非一致性成本、质量七工具
查看>>
维基解密发布了 CIA 黑客攻击操作的代码
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——2.2 bash脚本编程
查看>>
Oracle存储过程迁移ODPS-00(专有云):Oracle - ODPS数据类型转换
查看>>
Ubuntu 发行版将停止支持 i386 架构
查看>>
《电路分析导论(原书第12版)》一第2章 电压和电流
查看>>
wine32和wine64共存编译安装方法
查看>>