#10053 L 语言
dalao 看来是水题?我可不这么认为。
很多人都写了我认为不怎么正确的贪心,那就是直接看到一个单词就减去。
那么这组数据就可以 hack 掉了:
2 1
whatis
what
whatisyourname
贪心法写出来是 \(4\) 但是答案为 \(6\)。
那怎么办?网上各路神仙有各种神仙做法,但是我选择了比较正常的 AC 自动机。
为什么是 AC 自动机:多模匹配不就是 AC 自动机模板吗。
具体方法如下:
- 正常建立 trie 图。
- 在插入的同时记录一个 \(depth_i\),表示节点 \(i\) 到根节点的距离。
- 根据每一个母串跑 AC 自动机,对于每一个节点,当匹配成功时立刻 break。
- 判断匹配成功的方法:
ed[j] && flag[i+1-depth[j]]。
可以发现,这里同样是类似于上面的贪心的立刻 break,但是这里的 AC 自动机是正确的,为什么?
同样是上面那组 hack 数据,当what判断后立刻 break,
之后到母串的whatis时,发现代表s的节点任然匹配成功,所以匹配了whatis。
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <cstring>
#include <queue>
#define N 30010
#define M 1000010
using namespace std;
int n, m, trie[N][30], fail[N], tot = 0, depth[N];
bool ed[N], flag[M];
char a[20], s[M];
void insert(char* a) {
int p = 0, len = strlen(a);
for (int i = 0; i < len; i++) {
int ch = a[i] - 'a';
if (!trie[p][ch]) {
trie[p][ch] = ++tot;
depth[tot] = depth[p] + 1;
}
p = trie[p][ch];
}
ed[p] = true;
return;
}
void get_fail() {
queue<int> q;
for (int i = 0; i < 26; i++)
if (trie[0][i]) {
fail[trie[0][i]] = 0;
q.push(trie[0][i]);
}
while (!q.empty()) {
int now = q.front();
q.pop();
for (int i = 0; i < 26; i++)
if (trie[now][i]) {
fail[trie[now][i]] = trie[fail[now]][i];
q.push(trie[now][i]);
} else
trie[now][i] = trie[fail[now]][i];
}
return;
}
int AC_work(char* a) {
memset(flag, false, sizeof(flag));
flag[0] = true;
int p = 0, len = strlen(a);
for (int i = 0; i < len; i++) {
p = trie[p][a[i] - 'a'];
for (int j = p; j; j = fail[j])
if (ed[j] && flag[i + 1 - depth[j]]) {//+1 是为了后面好统计。
flag[i + 1] = true;//+1 是为了后面好统计。
break;
}
}
for (int i = len; i; i--)
if (flag[i])
return i;
return 0;
}
int main() {
scanf("%d %d", &n, &m);
memset(ed, false, sizeof(ed));
for (int i = 1; i <= n; i++) {
scanf("%s", a);
insert(a);
}
get_fail();
for (int i = 1; i <= m; i++) {
scanf("%s", s);
printf("%d\n", AC_work(s));
}
return 0;
}
#10053 L 语言的更多相关文章
- 【Trie】L 语言
[题目链接]: https://loj.ac/problem/10053 [题意]: 给出n个模式串.请问文本串是由多少个模式串组成的. [题解]: 当我学完AC自动机后,发现这个题目也太简单了吧. ...
- BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]
1212: [HNOI2004]L语言 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1367 Solved: 598[Submit][Status ...
- 【BZOJ1212】[HNOI2004]L语言 Trie树
[BZOJ1212][HNOI2004]L语言 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构 ...
- BZOJ 1212: [HNOI2004]L语言( dp + trie )
因为单词很短...用trie然后每次dp暴力查找...用哈希+dp应该也是可以的.... ------------------------------------------------------- ...
- [HNOI2004]Language L语言
2777: [HNOI2004]Language L语言 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 10 Solved: 5[Submit][S ...
- 1212: [HNOI2004]L语言
1212: [HNOI2004]L语言 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 643 Solved: 252[Submit][Status] ...
- 【BZOJ1212】L语言(AC自动机)
[BZOJ1212]L语言(AC自动机) 题面 BZOJ 题解 很自然的,既然要匹配单词,那就全部都丢到\(AC\)自动机里面去 现在想想怎么匹配 先是\(AC\)自动机正常的匹配 如果此时这个位置能 ...
- BZOJ_1212_[HNOI2004]L语言_哈希
BZOJ_1212_[HNOI2004]L语言_哈希 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写 ...
- 洛谷 P2292 [HNOI2004] L语言 解题报告
P2292 [HNOI2004] L语言 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章\(T\)是由若干小写字母构成.一个单词 ...
随机推荐
- 利用TfidfVectorizer进行中文文本分类(数据集是复旦中文语料)
1.对语料进行分析 基本目录如下: 其中train存放的是训练集,answer存放的是测试集,具体看下train中的文件: 下面有20个文件夹,对应着20个类,我们继续看下其中的文件,以C3-Art为 ...
- JVM系列【5】JVM常用指令
JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 指令集分类 基于寄存器的指令集 基于栈的指令集 Hotspot中的Loca ...
- git冲突的表现
<<<<<<< HEAD b789 ======= b45678910 >>>>>>> 6853e5ff961e68 ...
- 第3天 | 12天搞定Python,用VSCode编写代码
Visual Studio Code (简称 VS Code), 是一款免费并且开源的现代化轻量级代码编辑器,支持语法高亮.智能代码补全.自定义热键.括号匹配.代码片段等特性,并针对网页开发做了优化. ...
- 多测师讲解接口测试 —jmeter接数据库(004)_高级讲师肖sir
1.连接数据库jar包 2. 3. jdbc:mysql://192.168.153.131:3306/baoan?zeroDateTimeBehavior=convertToNull&all ...
- 多测师讲解html _段落标签002_高级讲师肖sir
<html> <head> <meta charset="UTF-8"> <title>段落标签</title> < ...
- sop服务治理
一,为什么需要服务治理: 我们最先接触的单体架构, 整个系统就只有一个工程, 打包往往是打成了 war 包, 然后部署到单一 tomcat 上面, 这种就是单体架构, 如图: 假如系统按照功能划分了, ...
- nc发送数据到端口
head -n 1 /etc/passwd | nc localhost 9200
- swoft 事件监听和触发 打印sql日志
需求 打印出swoft的所有sql日志到控制台或者文件 只要打开listener 下面 Dbranlisten.php 里面最后一行注释即可,swoft已经帮我们实现好了 ____ _____ ___ ...
- spring boot:构建多模块项目(spring boot 2.3.1)
一,为什么要使用多模块? 1,结构更清晰,方便管理 如果只是一个小项目当然没有问题, 但如果功能越增越多则管理越来越复杂, 多模块可以使项目中模块间的结构分离 2,把项目划分成多 ...