【BZOJ4327】JSOI2012 玄武密码 AC自动机
【BZOJ4327】JSOI2012 玄武密码
Description
Input
Output
Sample Input
SNNSSNS
NNSS
NNN
WSEE
Sample Output
2
0
HINT
对于100%的数据,N<=10^7,M<=10^5,每一段文字的长度<=100。
题解:沿着AC自动机搜几遍即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int maxn=10000010;
struct node
{
int ch[4],fail,cnt,vis,ans,dep;
}p[maxn];
int dic(char le)
{
switch(le)
{
case 'E':return 0;
case 'S':return 1;
case 'W':return 2;
case 'N':return 3;
}
}
int n,m,tot;
int Q[maxn],pos[100010];
char w[110],str[maxn];
queue<int> q;
void build()
{
int i,u,t;
q.push(1);
while(!q.empty())
{
u=q.front(),q.pop();
Q[++Q[0]]=u;
for(i=0;i<4;i++)
{
if(p[u].ch[i])
{
q.push(p[u].ch[i]);
t=p[u].fail;
while(!p[t].ch[i]&&t) t=p[t].fail;
if(t) p[p[u].ch[i]].fail=p[t].ch[i];
else p[p[u].ch[i]].fail=1;
}
}
}
}
void search()
{
int i,j,u=1,t;
p[u].vis=0;
for(i=0;i<n;i++)
{
while(!p[u].ch[dic(str[i])]&&u) u=p[u].fail;
u=p[u].ch[dic(str[i])];
u=u>0?u:1;
p[u].vis=1;
}
for(i=tot;i>=2;i--) p[p[Q[i]].fail].vis|=p[Q[i]].vis;
for(i=1;i<=tot;i++)
{
if(p[Q[i]].vis) p[Q[i]].ans=p[Q[i]].dep;
for(j=0;j<4;j++)
if(p[Q[i]].ch[j])
p[p[Q[i]].ch[j]].ans=p[Q[i]].ans;
}
for(i=1;i<=m;i++) printf("%d\n",p[pos[i]].ans);
}
int main()
{
scanf("%d%d%s",&n,&m,str);
int i,j,k,u,t;
tot=1;
for(i=1;i<=m;i++)
{
scanf("%s",w);
k=strlen(w);
u=1;
for(j=0;j<k;j++)
{
if(!p[u].ch[dic(w[j])]) p[u].ch[dic(w[j])]=++tot;
u=p[u].ch[dic(w[j])];
p[u].dep=j+1;
}
p[u].cnt++;
pos[i]=u;
}
build();
search();
return 0;
}
【BZOJ4327】JSOI2012 玄武密码 AC自动机的更多相关文章
- BZOJ4327 [JSOI2012] 玄武密码 [AC自动机]
题目传送门 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神 ...
- BZOJ 4327 [JSOI2012]玄武密码 (AC自动机)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4327 题解: 做法挺显然,建出AC自动机之后在上面跑,标记所有走过的点,然后再进行递推 ...
- BZOJ4327 JSOI2012玄武密码(AC自动机)
当然可以在SA上二分答案,但看起来会被卡log.考虑对模板串建出AC自动机,用母串在上面跑,标记上所有能到达的点.注意到达某个点时需要标记所有其通过fail指针可以走到的点,如果遇到一个标记过的点就可 ...
- 【AC自动机】bzoj4327: JSOI2012 玄武密码
题目思路没话讲:主要是做题时候的细节和经验 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中 ...
- Vijos P1951 玄武密码 (AC自动机)
描述 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年后,人们终于在 ...
- TZOJ 5986 玄武密码(AC自动机)
描述 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年后,人们终于在 ...
- BZOJ 4327: JSOI2012 玄武密码 后缀自动机
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...
- BZOJ4327 : JSOI2012 玄武密码
对所有询问串建立AC自动机. 然后将母串在AC自动机上跑,每走到一个点x,从x点出发沿着fail指针能到的所有前缀都是匹配成功的,暴力向上走,碰到走过的就break,这样每个点最多只会被标记一次. 时 ...
- BZOJ4327:[JSOI2012]玄武密码(SAM)
Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. ...
随机推荐
- Spring 中的注解
1.普通方式注解 a.在配置文件中配置 1.导入命名空间 xmlns:context="http://www.springframework.org/schema/ ...
- cocos2dx ease 公式
所有ease计算公式都在CCTweenFunction.cpp里.
- python3 读取大文件分解成若干小文件
有个数据实在太大了,有1.7G,打开慢,改文件也慢,我们将其分解成若干个中等文件 #!/usr/bin/env python3 # -*- coding: utf-8 -*- f = open(& ...
- 4 - 执行TestNG
TestNG以如下几种方式被调用 命令行 ant Eclipse IntelliJ's IDEA 这部分对如何使用命令行方式调用TestNG进行阐述. 假设TestNG已经在你的classpath中, ...
- centos postfix 邮箱安装记录
---恢复内容开始--- #wget http://nchc.dl.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.9 ...
- php基础知识【函数】(3)字符串string
一.大小写转换 1.strtolower()--转换为小写. echo strtolower("Hello WORLD!"); //hello world! 2.strtouppe ...
- 练习2 D 题- 第几天?
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 给定一个日 ...
- oracle积累继续
选出当天的日期的数据 select * from test_table where to_char(datetime, 'yyyy-mm-dd')=to_char(sysdate,'yyyy-mm-d ...
- scheme和common lisp 区别
Scheme and Common Lisp use different names for some of the basic system functions. Many Lisp program ...
- Unity 3D物体的点击事件响应以及NGUI坐标和世界坐标的互相转换
Unity 版本:4.5 NGUI版本:3.6.5 参考链接:http://game.ceeger.com/Script/Camera/Camera.ScreenPointToRay.html,Uni ...