[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自动机)
题目传送门 题目描述: 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. ...
随机推荐
- java虚拟机(八)--java性能监控与故障处理工具
问题定位: 除了个人经验,知识,工具也是很重要的,通过数据进行问题分析,包括:运行日志.异常堆栈.GC日志.线程快照(threaddump/javacore文件 ).堆转储快照(heapdump/hp ...
- PHP 浏览器端输出中文正常,cmd中文乱码
cmd 运行php脚本乱码问题如果别的编码根据下面的自己换吧!chcp 65001 就是换成UTF-8chcp 936 可以换回默认的GBKchcp 437 是美国英语
- datatable 分组
public static void PrintPersons() { //准备数据 DataTable dt = new DataTable(); dt.Columns.Add(new DataCo ...
- Luogu P1311 选择客栈
暴力 我一开始做这道题先想到的就是暴力... 所以先说一下暴力的做法.首先在输入的时候讲花费小于P的位置标记下来,然后用两层循环枚举所有的两个客栈的组合方案.再用一层循环将两个客栈之间的位置扫一遍,如 ...
- iconfig1
#include<iostream> using namespace std; //测试 template 里面是否还可以有 template class alloc{ }; templa ...
- buf.writeInt32BE()函数详解
buf.writeInt32BE(value, offset[, noAssert]) buf.writeInt32LE(value, offset[, noAssert]) value {Numbe ...
- pogresql基础学习笔记
命令行工具:psql 可视化工具:pgAdmin 查看所有表: 命令行:\d sql:select * from pg_tables WHERE schemaname='public'; 查看表结构: ...
- 在eclipse中如何在大量项目中查找指定文件
在eclipse中如果希望在大量的项目中寻找指定的文件可不是一件轻松的事,还好eclipse提供了强大的搜索功能. 我们可以通过通配符或正则表达式来设定查寻条件,下面是操作示例: ctrl+h 打开搜 ...
- [BZOJ2120] 数颜色 && [bzoj2453] 维护队列(莫队 || 分块)
传送门 只有第一个,第二个权限题. 分块,然而wa,没看出来错在哪里,有时间再看. #include <cmath> #include <cstdio> #include &l ...
- noip模拟赛 第K小数
[问题描述]有两个正整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少.[输入格式]输入文件名为number.in.输入文件包 ...