【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指针可以走到的点,如果遇到一个标记过的点就可 ...
随机推荐
- IDEA算法导包后 import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey;报错
仔细查看报错原因就能知道,报错是因为包冲突的原因,可以每种只放一个jar包,就能过避免这种错误. 例如:只导入commons-codec-1.11-javadoc,jar和bcprov-jdk15on ...
- Harmonious Graph
D. Harmonious Graph 好后悔在写这个题之前浪费了几分钟时间,不然我就写出来了.... 因为他就是连通块之间的合并问题,所以就用并查集就好了 复杂度好像也只是线性的吧... 然后就A了 ...
- codeforces gym #101161F-Dictionary Game(字典树+树上删边游戏)
题目链接: http://codeforces.com/gym/101161/attachments 题意: 给一个可以变化的字典树 在字典树上删边 如果某条边和根节点不连通那么这条边也删除 谁没得删 ...
- overflow妙用--去除默认滚动条,内容仍可滚动
在开发中我们往往要去除默认滚动条,但是其在竖直方向的滚动效果仍然需要. <div id="parent"> <div id="child"&g ...
- 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 ...
- sass/scss 和 less对比
一. Sass/Scss.Less是什么? Sass (Syntactically Awesome Stylesheets)是一种动态样式语言,Sass语法属于缩排语法,比css比多出好些功能(如变量 ...
- React的Virtual DOM厉害了
React 的伟大之处就在于,提出了Virtual DOM这种新颖的思路,并且这种思路衍生出了React Native,有可能会统一Web/Native开发. 在性能方面,由于用到了Virtual D ...
- win10+mysql8.0安装
一.下载 mysql8.0 windows zip包下载地址: https://dev.mysql.com/downloads/mysql/ 1540951981(1).png 二.安装 1.解压 ...
- 如何使用git cherry-pick将同一个仓库的某个分支的某些commit合并到当前分支?
答: git cherry-pick <another-branch's commit-id>
- Vue tree自定义事件注意点
<template> <div id="Tree_ElementTree" style="height: 100%;"> <el- ...