博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牛客网暑假ACM多校第九场F-Typing pratice(AC自动机+最短路)
阅读量:5140 次
发布时间:2019-06-13

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

题意:给你n个字符串,再给你一个匹配串,问你对于匹配串的每一个字符,至少在后面添加几个字符,使得之前给的n的字符串中有添加后的串的后缀

解题思路:因为是要当多模式匹配,想到用AC自动机,因为要至少添加几个字符,所以我们把n个给定的字符串存在trie图中,把每个串结尾点标记,从结尾点开始往前bfs,这样可以算到,当前要匹配的字符串在trie图中匹配到某个位置后,至少需要多少步能走到结尾点,具体看代码

代码

#include
using namespace std;const int maxn=400500;const int inf=0x3f3f3f3f;int trie[maxn][26];int fail[maxn],tot;int flag[maxn];int dist[maxn];int n;vector
v[maxn];set
s;char t[maxn];void init(){ memset(trie,0,sizeof(trie));tot=0; memset(fail,0,sizeof(fail)); memset(flag,0,sizeof(flag)); memset(dist,inf,sizeof(dist)); s.clear();}void build_trie(char *str){ int root=0; int len=strlen(str); for(int i=0;i
q; for(int i=0;i<26;i++) { if(trie[0][i]!=0) q.push(trie[0][i]); } while(!q.empty()) { int now=q.front();q.pop(); if(flag[fail[now]]) { flag[now]=1;s.insert(now);//这里重点,如果一个点的fail指向某个结尾点,那么它也是结尾点;fail的定义是指向当前串的最长后缀 } for(int i=0;i<26;i++) { if(!trie[now][i]) { trie[now][i]=trie[fail[now]][i]; continue; } fail[trie[now][i]]=trie[fail[now]][i]; q.push(trie[now][i]); } }}void bfs(){ for(int i=0;i<=tot;i++) v[i].clear(); for(int i=0;i<=tot;i++) for(int j=0;j<26;j++) v[trie[i][j]].push_back(i);//把trie图反过来存 queue
q; for(set
::iterator it=s.begin();it!=s.end();it++) { q.push(*it);dist[*it]=0;//结尾点成开始搜索点 } while(!q.empty()) { int now=q.front();q.pop(); for(int i=0;i
sta;//。因为有减号,用栈存 int root=0; int now=root;//从根节点开始 cout<
<

 

转载于:https://www.cnblogs.com/huangdao/p/10828580.html

你可能感兴趣的文章
学习Shell的经典好书推荐
查看>>
《ASP.NET Core In Action》读书笔记系列一 ASP.NET Core 的诞生
查看>>
jQuery效果-隐藏与显示
查看>>
HTML5 中list 和datalist实例
查看>>
安装express 出现 错误
查看>>
python中网络编程中的黏包现象
查看>>
Java【第十二篇】枚举
查看>>
jqm页面跳转问题
查看>>
MyBatis入门学习教程-解决字段名与实体类属性名不相同的冲突
查看>>
PAT甲级 1111 - Online Map(最短路)
查看>>
测开之路三十:Flask基础之jinja2模板继承
查看>>
Mac下删除安装的pkg
查看>>
《深入理解Linux网络技术内幕》阅读笔记 --- 邻居子系统
查看>>
dropdownlist onSelectIndexChanged 事件
查看>>
c-3:位运算:位运算基本用法
查看>>
linux提权辅助工具(一):linux-exploit-suggester.sh
查看>>
[转] VS2017 打包安装程序
查看>>
Hadoop分布式文件系统中架构和设计要点汇总
查看>>
cout和printf
查看>>
L1-Day5
查看>>