[JSOI 2012] 玄武密码
[题目链接]
https://www.lydsy.com/JudgeOnline/problem.php?id=4327
[算法]
AC自动机
[代码]
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e7 + ;
const int MAXM = 1e5 + ;
const int MAXLEN = ; int n,m;
int ans[MAXM];
char P[MAXN];
char s[MAXM][MAXLEN]; inline int get_value(char a)
{
if (a == 'E') return ;
if (a == 'S') return ;
if (a == 'W') return ;
if (a == 'N') return ;
}
struct AC_Automation
{
int tot;
int root;
struct Node
{
int child[];
int fail;
bool visited;
} trie[MAXN];
inline void insert(char *s)
{
int now = root;
int len = strlen(s + );
for (int i = ; i <= len; i++)
{
int val = get_value(s[i]);
if (!trie[now].child[val]) trie[now].child[val] = ++tot;
now = trie[now].child[val];
}
}
inline void rebuild()
{
int l,r;
static int q[MAXN];
q[l = r = ] = root;
trie[root].fail = -;
while (l <= r)
{
int cur = q[l];
l++;
for (int i = ; i < ; i++)
{
if (trie[cur].child[i])
{
if (cur == root)
trie[trie[cur].child[i]].fail = ;
else
{
int p = trie[cur].fail;
while (p != -)
{
if (trie[p].child[i])
{
trie[trie[cur].child[i]].fail = trie[p].child[i];
break;
} else p = trie[p].fail;
}
}
q[++r] = trie[cur].child[i];
}
}
}
}
inline void getans(char *s)
{
int now = root;
int len = strlen(s + );
for (int i = ; i <= len; i++)
{
int val = get_value(s[i]);
int p = now;
while (p != -)
{
if (trie[p].child[val]) break;
else p = trie[p].fail;
}
if (p == -)
{
now = ;
continue;
} else now = p = trie[p].child[val];
while (p)
{
if (!trie[p].visited)
{
trie[p].visited = true;
p = trie[p].fail;
} else break;
}
}
}
inline void calc(int pos,char *s)
{
int now = root;
int len = strlen(s + );
for (int i = ; i <= len; i++)
{
int val = get_value(s[i]);
now = trie[now].child[val];
if (trie[now].visited) ans[pos] = i;
}
}
} ACAM; int main()
{ scanf("%d%d",&n,&m);
scanf("%s",P + );
for (int i = ; i <= m; i++) scanf("%s",s[i] + );
for (int i = ; i <= m; i++) ACAM.insert(s[i]);
ACAM.rebuild();
ACAM.getans(P);
for (int i = ; i <= m; i++) ACAM.calc(i,s[i]);
for (int i = ; i <= m; i++) printf("%d\n",ans[i]); return ; }
[JSOI 2012] 玄武密码的更多相关文章
- Vijos P1951 玄武密码 (AC自动机)
描述 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年后,人们终于在 ...
- 【BZOJ4327】JSOI2012 玄武密码 AC自动机
[BZOJ4327]JSOI2012 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香 ...
- 4327: JSOI2012 玄武密码
4327: JSOI2012 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老 ...
- BZOJ4327:[JSOI2012]玄武密码(SAM)
Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. ...
- 4327: JSOI2012 玄武密码[SAM]
4327: JSOI2012 玄武密码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 263 Solved: 112[Submit][Status] ...
- P5231 [JSOI2012]玄武密码
P5231 [JSOI2012]玄武密码 链接 分析: 首先对所有询问串建立AC自动机,然后扫描一遍母串,在AC自动机上走,没走到一个点,标记这个点走过了,并且它的fail树上的祖先节点也可以访问到( ...
- BZOJ4327 [JSOI2012] 玄武密码 [AC自动机]
题目传送门 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神 ...
- BZOJ-4327:JSOI2012 玄武密码(AC自动机模板题)
在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年后,人们终于在进香 ...
- [BZOJ4327]:[JZOI2012]玄武密码(AC自动机)
题目传送门 题目描述: 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. ...
随机推荐
- PHP爬数据 QueryList
QueryList官方文档:https://www.querylist.cc/docs/guide/v3 因为php版本使用5.6,所以使用QueryList v3版本,php7可以使用 v4版本 v ...
- 怎么让Eclipse对html和js代码自动提示
使用eclipse自带的插件,无需另外安装插件,具体步骤如下1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist修改Auto Activ ...
- 迷宫问题 POJ - 3984 (搜索输出路径)
题目大意 题目不需要大意,poj居然还有中文题 鸣谢 特别鸣谢ljc大佬提供的方法!!! 解法 我们可能输出个最短路径的长度比较简单,但是输出最短路径真的是没有做过,这里有一种简单的方法 因为我们的d ...
- linux常用操作记录
vim:多行注释 vim中多行注释和多行删除命令,这些命令也是经常用到的一些小技巧,可以大大提高工作效率. 多行注释: 1. 首先按esc进入命令行模式下,按下Ctrl + v,进入列(也叫区 ...
- java一维数组的声明、初始化及排序
public class TestArray { public static void main(String[] args) { /** 数组声明及动态初始化 int a[] = new int[a ...
- db2 group by的疑惑。
按借据号分组,显示每组的条数:
- Linux命令学习(3): zcat 直接查看压缩文件
版权声明:本文为博主原创文章,未经允许不得转载. zcat 用途:在不解压文件的情况下,直接将文件内容输出到标准输出.(原压缩文件不做任何更改) 格式:zcat [-n] [-V] [FILE] 参数 ...
- Linux文件/目录,权限相关
查看权限 命令 # ls -l filename 结果 -rw-r--r-- l root root 27 11-10 14:50 filename 解析: -rw-r--r-- --共10位 第1位 ...
- 基于python、jupyter-notebook 的金融领域用户交易行为分析
说明:本文重在说明交易数据统计.分析方法,所有数据均为生成的数据 时间原因代码未定义成函数 统计指标:1.用户单日交易行为数据 2.按小时为计算单位,统计用户行为数据(旨在求得一天24小时中每个小时的 ...
- idea 类图显示
不得不说idea java开发的神器啊,免去了自己画图的很多工作量. 打开类图快捷键:Ctrl+Alt+Shift+U