L 语言

dalao 看来是水题?我可不这么认为。

很多人都写了我认为不怎么正确的贪心,那就是直接看到一个单词就减去。

那么这组数据就可以 hack 掉了:

2 1

whatis

what

whatisyourname

贪心法写出来是 \(4\) 但是答案为 \(6\)。

那怎么办?网上各路神仙有各种神仙做法,但是我选择了比较正常的 AC 自动机。

为什么是 AC 自动机:多模匹配不就是 AC 自动机模板吗。

具体方法如下:

  1. 正常建立 trie 图。
  2. 在插入的同时记录一个 \(depth_i\),表示节点 \(i\) 到根节点的距离。
  3. 根据每一个母串跑 AC 自动机,对于每一个节点,当匹配成功时立刻 break。
  4. 判断匹配成功的方法: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 语言的更多相关文章

  1. 【Trie】L 语言

    [题目链接]: https://loj.ac/problem/10053 [题意]: 给出n个模式串.请问文本串是由多少个模式串组成的. [题解]: 当我学完AC自动机后,发现这个题目也太简单了吧. ...

  2. BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1367  Solved: 598[Submit][Status ...

  3. 【BZOJ1212】[HNOI2004]L语言 Trie树

    [BZOJ1212][HNOI2004]L语言 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构 ...

  4. BZOJ 1212: [HNOI2004]L语言( dp + trie )

    因为单词很短...用trie然后每次dp暴力查找...用哈希+dp应该也是可以的.... ------------------------------------------------------- ...

  5. [HNOI2004]Language L语言

    2777: [HNOI2004]Language L语言 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 10  Solved: 5[Submit][S ...

  6. 1212: [HNOI2004]L语言

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 643  Solved: 252[Submit][Status] ...

  7. 【BZOJ1212】L语言(AC自动机)

    [BZOJ1212]L语言(AC自动机) 题面 BZOJ 题解 很自然的,既然要匹配单词,那就全部都丢到\(AC\)自动机里面去 现在想想怎么匹配 先是\(AC\)自动机正常的匹配 如果此时这个位置能 ...

  8. BZOJ_1212_[HNOI2004]L语言_哈希

    BZOJ_1212_[HNOI2004]L语言_哈希 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写 ...

  9. 洛谷 P2292 [HNOI2004] L语言 解题报告

    P2292 [HNOI2004] L语言 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章\(T\)是由若干小写字母构成.一个单词 ...

随机推荐

  1. mysql-14-transaction

    #TCL /* 事务控制语言 事务:一个或一组sql语句组成一个执行单元,每条sql语句相互依赖 这个执行单元要么全部执行.要么全部失败后回滚 案例:转账 事务的acid属性 1.原子性:事务时一个不 ...

  2. unity 3d 三、空间与运动

    3D游戏编程第三次作业 简答并用程序验证[建议做] 游戏对象运动的本质是什么? 游戏对象运动的本质是游戏对象Position.Rotate.Scale属性数值的变化. 请用三种方法以上方法,实现物体的 ...

  3. 如何用5000行JS撸一个关系型数据库

    首先声明,我不是标题党,我真的是用5000行左右的JS实现了一个轻量级的关系型数据库JSDB,核心是一个SQL编译器,支持增删改查. 源代码放到github上了:https://github.com/ ...

  4. matlab中fix, floor, ceil, round 函数的使用方法

    转载: https://www.ilovematlab.cn/thread-91895-1-1.html Matlab取整函数有: fix, floor, ceil, round.具体应用方法如下: ...

  5. Python+Appium自动化测试(11)-location与size获取元素坐标

    appium做app自动化测试过程中,有时需要获取控件元素的坐标进行滑动操作.appium中提供了location方法获取控件元素左上角的坐标,再通过size方法获取控件元素的宽高,就可以得到控件元素 ...

  6. 非阻塞I/O和阻塞I/O

    1.简介 等待队列实现在事件上的条件等待:希望等待特定事件的进程把自己放进合适的等待队列,并放弃控制权.可用于: - 中断处理 - 进程同步 - 定时 2.等待队列头数据结构 1 typedef st ...

  7. lua 1.0 源码分析 -- 总结

    读完 lua1.0 的源码感触:1. 把复杂的代码写简单2. pack 的内存回收3. hash 实现简单,但是应该可以改进,看高版本的代码怎么实现4. lua 初始化环境做了什么,就是一组全局变量初 ...

  8. day28 Pyhton 面向对象 继承

    1.昨日回顾 类的命名空间 静态属性\动态属性(方法) 对象的命名空间 #对象的属性 #类指针:对象能够通过这个类指针找到类 #静态属性:属于类,多个对象共享这个资源 #尽量用类名来操作静态属性 #对 ...

  9. 【数论】HDU 4143 A Simple Problem

    题目内容 给出一个正整数\(n\),找到最小的正整数\(x\),使之能找到一个整数\(y\),满足\(y^2=n+x^2\). 输入格式 第一行是数据组数\(T\),每组数据有一个整数\(n\). 输 ...

  10. idea创建servlet工程初体验

    servlet工程创建 前提:创建项目之前需要配置java环境变量 和tomcat配置,配置完成后进入如下操作. tomcat 安装和配置参考 https://www.cnblogs.com/xush ...