【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指针可以走到的点,如果遇到一个标记过的点就可 ...
随机推荐
- java 架构师思维导图
java 基础 . 理解IO.多线程.集合等基础框架.对JVM原理有一定了解. spring spring boot ibatis structs开源框架了解. 熟悉分布式系统设计和应用. 小 ...
- SQLyog Enterprise Trial 试用期问题
SQLyog Enterprise Trial 是 SQLyog的试用版,有效期30天:试用期过后提示购买之后才能使用:解决办法:修改注册表(过期就得改比较麻烦,但暂时可以用,等有时间了再找其他办法) ...
- 定位ScheduledExecutorService过了一段时间不执行问题
今天查看生产环境的sentinel控制台,发现某dubbo应用一共5个节点,有3个失联了. 查看失联节点的应用日志,服务没有挂,各dubbo接口的日志正常在打印. 在应用节点ping/telnet s ...
- windows工程总结
1.win32控制台console程序 运行在MS-DOS环境中的程序.控制台应用程序通常没有可视化的界面,只是通过字符串来显示或者监控程序.控制台程序常常被应用在测试.监控等用途,用户往往只关心数据 ...
- [drf]model设置
参考 //# 给model添加虚拟字段 class CeleryExampleResult(models.Model): task_id = models.BigIntegerField(defaul ...
- PS改变图片像素大小(一寸照片变二寸)
1.打开Photoshop,点击“文件”菜单,选择“打开”,将要处理的图片加载进来 2.找到“图像”菜单,选择“图像大小”,我们在这里对图片进行处理. 3.根据需要对其分辨率或者尺寸进行设置,设置好后 ...
- 常见的RSA套路脚本
工具 rsatool https://github.com/ius/rsatool factordb(分解大素数) http://www.factordb.com python-PyCrypto库 O ...
- [Python]编译错误:编码错误问题(SyntaxError: (unicode error) )
1 错误信息 python文件 1 #coding:utf-8 2 3 class Clz: 4 def func(filePath): 5 """ 6 func 7 - ...
- [转]将西部数据 My Passport Wireless 移动存储连接到任何支持的云存储上
原文标题:对西部数据 My Passport Wireless 移动存储进行 Linux 魔改 原文链接:https://linux.cn/article-8246-1.html 虽然 WD My P ...
- 取消一个本地svn目录与svn的联系
第一种方法: 直接.逐级地删除目标目录中的隐藏属性的.svn目录 这个方法试了,好牛蛋...,省事,快速... 第二种方法: 如果用的是TortoiseSVN客户端,则先在另外一处建立一个新目录A,右 ...