4327: JSOI2012 玄武密码
4327: JSOI2012 玄武密码
Description
Input
Output
Sample Input
SNNSSNS
NNSS
NNN
WSEE
Sample Output
2
0
HINT
对于100%的数据,N<=10^7,M<=10^5,每一段文字的长度<=100。
这题虽说是板子,但也不能只用板子,是一道比较不错的AC自动机题目。首先发现多模式串,二话不说上AC自动机,但是发现只有‘E’、‘S’、‘W’、‘N’这四个字母,所以可以优化一下建立起从‘E’、‘S’、‘W’、‘N’到‘a’、‘b’、‘c’、‘d’的映射就好了,然后要查询每个串的前缀与母串的最大匹配长度,那我们就在trie树上标记母串所有的可以匹配到的位置,然后对于每一个模式串,我们就从它的trie树上进行检索,当发现第一个没有被母串匹配到的结点时,当前长度就是最大的匹配长度。另外还有一个小小的优化,如果说对于一个节点它已经被标记过了,那么它的next链上的所有点一定也被标记了,所以这时就可以直接break。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<map>
#include<queue>
#include<stack>
#include<algorithm>
#include<vector>
#define man 100005
#define maxn 10000005
using namespace std; inline int read()
{
char c=getchar();
int res=,x=;
while(c<''||c>'')
{
if(c=='-')
x=-;
c=getchar();
}
while(c>=''&&c<='')
{
res=res*+(c-'');
c=getchar();
}
return res*x;
} int n,m,tot=;
int tree[maxn][],nt[maxn],bo[maxn],f[maxn];
char a[maxn],d[],b[man][];
queue<int>q; char pd(char c)
{
if(c=='E') return d[];
else if(c=='S') return d[];
else if(c=='W') return d[];
else return d[];
} void trie(char *s)
{
int len=strlen(s),u=;
for(register int i=;i<len;i++)
{
int c=s[i]-'a';
if(!tree[u][c])
tree[u][c]=++tot;
u=tree[u][c];
}
bo[u]=;
} void bfs()
{
for(register int i=;i<=;i++)
tree[][i]=;
nt[]=;q.push();
while(q.size())
{
int u=q.front();q.pop();
for(register int i=;i<=;i++)
{
if(!tree[u][i])
tree[u][i]=tree[nt[u]][i];
else
{
int v=tree[u][i];
q.push(v);
nt[v]=tree[nt[u]][i];
}
}
}
} void find(char *s)
{
int len=strlen(s),u=,k;
for(register int i=;i<len;i++)
{
int c=s[i]-'a';
k=tree[u][c];
while(k>)
{
if(f[k]) break;//小小的优化 原理就是这个节点被标记过时,它的
f[k]=;//next链上的点也一点被标记了,所以没必要再跳一次next
k=nt[k];//链,直接break掉就好了。
}
u=tree[u][c];
}
} int ask(char *s)
{
int len=strlen(s),u=;
for(register int i=;i<len;i++)
{
int c=s[i]-'a';
u=tree[u][c];
if(!f[u]) return i;
}
return len;
} int main()
{
n=read();m=read();
d[]='a';d[]='b';d[]='c';d[]='d';
scanf("%s",a);
for(register int i=;i<n;i++)
{
a[i]=pd(a[i]);
}
for(register int i=;i<=m;i++)
{
scanf("%s",b[i]);
int len=strlen(b[i]);
for(register int j=;j<len;j++)
{
b[i][j]=pd(b[i][j]);
}
trie(b[i]);
}
bfs();
find(a);
for(register int i=;i<=m;i++)
{
printf("%d\n",ask(b[i]));
}
return ;
}
4327: JSOI2012 玄武密码的更多相关文章
- 4327: JSOI2012 玄武密码[SAM]
		4327: JSOI2012 玄武密码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 263 Solved: 112[Submit][Status] ... 
- BZOJ 4327: JSOI2012 玄武密码 后缀自动机
		Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ... 
- BZOJ 4327 JSOI2012 玄武密码(后缀自动机)
		[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4327 [题目大意] 求每个子串在母串中的最长匹配 [题解] 对母串建立后缀自动机,用每 ... 
- BZOJ 4327 [JSOI2012]玄武密码 (AC自动机)
		题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4327 题解: 做法挺显然,建出AC自动机之后在上面跑,标记所有走过的点,然后再进行递推 ... 
- bzoj 4327: JSOI2012 玄武密码
		听说这题不公开.. 那就不贴题意了 一眼看上去还以为是exkmp的裸题.. 看了数据范围,呵呵.. 多串匹配嘛.. 就用AC自动机咯,而且每个点最多也就只有$4$个孩子 用原串在AC自动机上走,碰到的 ... 
- 【题解】bzoj 4327 JSOI2012 玄武密码
		原题传送门 我们先对所有询问串建立AC自动机(今天洛咕上有人分不清AC自动机和自动AC机) 然后将母串在AC自动机上跑,每走到一个点x,从x点出发沿着fail指针所能到的所有前缀都是匹配成功的,暴力向 ... 
- 【BZOJ4327】JSOI2012 玄武密码 AC自动机
		[BZOJ4327]JSOI2012 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香 ... 
- P5231 [JSOI2012]玄武密码
		P5231 [JSOI2012]玄武密码 链接 分析: 首先对所有询问串建立AC自动机,然后扫描一遍母串,在AC自动机上走,没走到一个点,标记这个点走过了,并且它的fail树上的祖先节点也可以访问到( ... 
- 2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机)
		2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机) https://www.luogu.com.cn/problem/P5231 题意: 给出字符串S和若干T,求S与每个T的 ... 
随机推荐
- React笔记:组件(3)
			1. 组件定义 组件是React的核心概念,组件将应用的UI拆分成独立的.可复用的模块. 定义组件的两种方式: (1)类组件:使用ES6 class (2)函数组件:使用函数 使用class定义组件的 ... 
- CSS高度塌陷问题与解决办法
			问题描述: 在文档流中,父元素默认被子元素撑开(父多高子多高),一旦子浮动,脱离文档流,父无撑起元素便塌陷,父下的所有元素会上移. (不推荐)可以将父高度写死避免塌陷,但高度写死后,父高度不能自动适应 ... 
- 【.Net】优秀的开源框架
			AutoMapper 官网:http://automapper.org/ github:https://github.com/AutoMapper/AutoMapper 文档:http://autom ... 
- tensorflow-RNN和LSTM
			本章主要介绍循环神经网络(recurrent neuralnetwork,RNN)和长短时记忆网络(long short-term memory,LSTM) 一. RNN简介 1.背景 循环神经网络挖 ... 
- Android Intent 传递数据注意事项
			不要通过 Intent 在 Android 基础组件之间传递大数据(binder transaction缓存为 1MB),可能导致 OOM. 
- 基于 Markdown 编写接口文档
			最近公司开发项目需要前后端分离,这样话就设计到后端接口设计.复杂功能需要提供各种各样的接口供前端调用,因此编写API文档非常有必要了 网上查了很多资料,发现基于Markdown编写文档是一种比较流行而 ... 
- vue-输入框change事件并获取值
			1.html <input type="text" @change="specifiName($event)" /> 2.js var vm = n ... 
- TensorFlow windows 安装(base anaconda)
			Python conda安装之后(19年默认是python3.7) 1.降级到python3.6 2.查看python版本 3.安装tensorflow 
- [转载]再谈PostgreSQL的膨胀和vacuum机制及最佳实践
			本文转载自 www.postgres.cn 下的文章: 再谈PostgreSQL的膨胀和vacuum机制及最佳实践http://www.postgres.cn/news/viewone/1/390 还 ... 
- request redirection
			# encoding:utf-8 import reimport jsonimport randomfrom esdapi.config import BASE_URLfrom requests.se ... 
