【AC自动机】玄武密码
【题目链接】
【题意】
对于每一段文字,其前缀在母串上的最大匹配长度是多少呢
【参考别人的题解】
https://www.luogu.org/problemnew/solution/P5231
我们只需要先建立所有密码的trie树
再以母串为主串跑一个AC自动机
不过其中还是有一些需要改动的地方
原本字典树中用来记录某个节点是不是字符串结尾的数组不需要,直接删去
我们需要另一个数组来标记哪些点被匹配
跑完ac自动机后从trie树上找最后一个匹配的点即可
优化:由于nxt数组是递归到0的所以只要有一个点被标记过,那么这个点到0的所有点都已经被遍历过直接退出即可
【自己理解】
其实这个题目就是套路。
1、建模式串的AC自动机。
2、利用文本串跑一遍AC自动机,把对应的位置标记上。
3、再跑一遍模式串,去最长的位置就是答案了。
【代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M = 2e7 + ;
const int N = 2e5+ ;
char T[M];
char P[N][];
int Trie[M][],Match[M],fail[M],Cnt[M];
int Q[M],Head,Tail;
int n,m,idx=; int calc( char x ){
if( x == 'N' ) return ;
else if( x=='E' ) return ;
else if( x=='S' ) return ;
else return ;
}
void Insert(char s[],int Id){
int p = ;
for(int i=;s[i];i++){
int t = calc(s[i]);
if( !Trie[p][t] )
Trie[p][t] = ++idx ;
p = Trie[p][t];
}
Match[Id] = p ;
}
void Build(){
Head = , Tail = ;
for(int i=;i<;i++) Trie[][i] = ; Q[++Tail] = ;
while( Head <= Tail ){
int u = Q[Head++] ;
for(int i=;i<;i++){
int To = Trie[u][i];
if( To ){
fail[To] = Trie[fail[u]][i];
Q[ ++Tail ] = To ;
}else{
Trie[u][i] = Trie[fail[u]][i];
}
}
}
}
void Query(char T[]){ int p = ;
for(int i=;T[i];i++){
p = Trie[p][calc(T[i])];
for(int j=p;j;j=fail[j]){
if( Cnt[j] ) break;
Cnt[j] = ;
}
} for(int i=;i<=m;i++){
int res = , p = ;
for(int j=;P[i][j];j++){
p = Trie[p][calc(P[i][j])];
if( Cnt[p] ) res = j + ;
}
printf("%d\n",res);
}
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%s",T);
for(int i=;i<=m;i++){
scanf("%s",P[i]);
Insert( P[i] , i );
}
Build();
Query(T);
return ;
}
玄武密码
【AC自动机】玄武密码的更多相关文章
- [AC自动机]玄武密码
题目描述 一个长度为\(N\)的母串,有四个元素分别是:N,S,W,N. 有M个长度为100的模式串. 现在要求每个模式串的前缀与母串匹配最长长度. 输入样例 7 3 SNNSSNS NNSS NNN ...
- 【BZOJ4327】JSOI2012 玄武密码 AC自动机
[BZOJ4327]JSOI2012 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香 ...
- BZOJ4327 [JSOI2012] 玄武密码 [AC自动机]
题目传送门 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神 ...
- BZOJ-4327:JSOI2012 玄武密码(AC自动机模板题)
在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年后,人们终于在进香 ...
- [BZOJ4327]:[JZOI2012]玄武密码(AC自动机)
题目传送门 题目描述: 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. ...
- Vijos P1951 玄武密码 (AC自动机)
描述 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年后,人们终于在 ...
- TZOJ 5986 玄武密码(AC自动机)
描述 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年后,人们终于在 ...
- 2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机)
2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机) https://www.luogu.com.cn/problem/P5231 题意: 给出字符串S和若干T,求S与每个T的 ...
- BZOJ4327 JSOI2012玄武密码(AC自动机)
当然可以在SA上二分答案,但看起来会被卡log.考虑对模板串建出AC自动机,用母串在上面跑,标记上所有能到达的点.注意到达某个点时需要标记所有其通过fail指针可以走到的点,如果遇到一个标记过的点就可 ...
随机推荐
- sql mode 问题及解决 错误代码:1055 this is incompatible with sql_mode=only_full_group_by
数据库升级到5.7.21后,一个正常的分组后按日期排序,并返回数据的语句开始报错: 语句如下: SELECT id,title,add_time FROM `message` GROUP BY add ...
- CF1217B
CF1217B 题意: 有一个有 $ x $ 个头的龙,你有 $ n $ 种方案,每种方案中包含你可以砍掉的头 $ d_i $ 和龙会生长的头 $ h_i $ 找到一种方案,使得操作数最少. 解法: ...
- centos7的网络配置参考
<鸟哥的Linux私房菜>中的相关介绍和配置:http://linux.vbird.org/linux_basic/0610hardware.php 修改链接(connection)的名字 ...
- Java的Lambda表达式
Java的Lambda表达式 1. 什么是Lambda表达式 简单的说,Lambda表达式就是匿名方法.Lambda表达式让程序员能够使用更加简洁的代码,但是同样也使代码的可读性比较差. Lambda ...
- nodeJS 项目如何运行
nodeJS 项目如何运行 一.总结 一句话总结: nodejs项目根目录中用node xx.js 或是 node xx运行 打开 window的 cmd 命令窗口,使用 cd 命令跳转到 nodeJ ...
- win系统动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数. 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 Ge ...
- SQL-W3School-高级:SQL JOIN
ylbtech-SQL-W3School-高级:SQL JOIN 1.返回顶部 1. SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. Join 和 Key 有时为了得到完 ...
- Activiti核心API
ProcessEngine 说明: 1) 在Activiti中最核心的类,其他的类都是由他而来. 2) 产生方式: 在前面看到了两种创建ProcessEngine(流程引擎)的方式 ...
- spring常用模式--模板模式
引入:这几天在看一本讲spring源码的书<SPRING技术内幕>里面在讲加载配置文件的时候,可以有不同的加载方式,如根据文件系统目录加载配置文件(FileSystemXmlApplica ...
- 新maven项目创建JSP出现小红叉报错 javax.servlet.http.HttpServlet not found
展示: 右击项目----build path -----Configure Build Path 进入到窗口 libraries -------add libraries ------ server ...