【每日一题】7.月月查华华的手机 (枚举 or 序列自动机)
题目链接:Here
题意总结:\(N\) 次查询串 \(B\) 是否是 \(A\) 的子序列。
思路一
个人做法,枚举原字符串的每一位,如果匹配当前字符串的字符则 m++
直到字符串枚举完毕或者 m >= t.size()
- \(\mathcal{O}(N)\)
string s, t;
void solve() {
cin >> t;
int m = 0;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == t[m]) m++;
if (m >= t.size()) break;
}
cout << (m >= t.size() ? "Yes" : "No") << "\n";
}
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
int _;
cin >> s;
for (cin >> _; _--;) solve();
return 0;
}
博客这么结束就太短了,AC之后看了下其他人的解法。发现还有一些好解法,如下介绍:
思路二
预处理 \(A\) 串每个位置后,每个字母首次出现的位置。
\(tp[i][j]\) 表示A串第\(i\)个位置后,字符\(j\)首次出现的位置。从后往前扫一遍就出来了。
时间复杂度:\(\mathcal{O}(26|A|)\)
查询每个串B时用 \(tp\) 数组在A上跳。N次查询复杂度 \(\mathcal{O}(\sum_{i = 1}^N|B|)\)
这样做空间、时间复杂度是 O(2.6e7)。但是它过了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 7;
char s[N];
int tp[N][26];
int main(void) {
scanf("%s", s + 1);
int n = strlen(s + 1);
for (int i = n - 1; i >= 0; --i) {
for (int j = 0; j < 26; ++j) tp[i][j] = tp[i + 1][j];
tp[i][s[i + 1] - 'a'] = i + 1;
}
int q;
scanf("%d", &q);
while (q--) {
scanf("%s", s + 1);
int m = strlen(s + 1);
int pos = 0, flag = 1;
for (int i = 1; i <= m; ++i) {
if (tp[pos][s[i] - 'a']) {
pos = tp[pos][s[i] - 'a'];
} else {
flag = 0;
break;
}
}
cout << (flag ? "Yes" : "No") << "\n";
}
return 0;
}
思路三:序列自动机
序列自动机的构建的核心在于 \(next\) 数组
\(next_{i,j}\) 代表位置 \(i\) 后字符 \(j\) 第一次出现的位置。
当从位置 \(i + 1\) 移动到 i 时,显然只有一个字符的 next 值发生了变化
操作代码
void Build(void) {
n = strlen(s + 1);
for (int i = n; i >= 1; i--) {
for (int j = 0; j < 26; j++) fail[i - 1][j] = fail[i][j];
fail[i - 1][s[i] - 'a'] = i;
}
}
序列自动机的查找
从头向后移动匹配,一旦失配,直接失败。
bool check(void) {
int m = strlen(t + 1), pos = 0;
for(int i = 1; i <= m; i++) {
pos = fail[pos][t[i] - 'a'];
if(!pos) return false;
}
return true;
}
不难发现,这个题就是个模板题,粘贴好模板就行了。
#include <bits/stdc++.h>
using namespace std;
const int maxs = 1000000 + 7;
int n, T;
char s[maxs], t[maxs];
int fail[maxs][28];
void Build(void) {
n = strlen(s + 1);
for (int i = n; i >= 1; i--) {
for (int j = 0; j < 26; j++) fail[i - 1][j] = fail[i][j];
fail[i - 1][s[i] - 'a'] = i;
}
}
bool check(void) {
int m = strlen(t + 1), pos = 0;
for (int i = 1; i <= m; i++) {
pos = fail[pos][t[i] - 'a'];
if (!pos) return false;
}
return true;
}
int main(void) {
scanf("%s", s + 1);
Build();
scanf("%d", &T);
while (T--) {
scanf("%s", t + 1);
cout << (check() ? "Yes" : "No") << "\n";
}
return 0;
}
【每日一题】7.月月查华华的手机 (枚举 or 序列自动机)的更多相关文章
- 【python】Leetcode每日一题-132模式
[python]Leetcode每日一题-132模式 [题目描述] 给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j &l ...
- 牛客小白月赛12 J 月月查华华的手机 (序列自动机模板题)
链接:https://ac.nowcoder.com/acm/contest/392/J 来源:牛客网 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机.月月出于人类最单纯的好奇 ...
- NC23053 月月查华华的手机
NC23053 月月查华华的手机 题目 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机.月月出于人类最单纯的好奇心,打开了华华的手机.哇,她看到了一片的QQ推荐好友,似乎华华还 ...
- 牛客小白月赛12 J 月月查华华的手机(序列自动机)
---恢复内容开始--- 题目来源:https://ac.nowcoder.com/acm/contest/392/J 题意: 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机. ...
- Newcoder 华华给月月出题(线筛)题解
题目描述: 华华刚刚帮月月完成了作业.为了展示自己的学习水平之高超,华华还给月月出了一道类似的题: Ans=⊕Ni=1(iNmod(109+7))Ans=⊕i=1N(iNmod(109+7)) ⊕⊕符 ...
- 牛客小白月赛12 D 月月给华华出题 (欧拉函数,数论,线筛)
链接:https://ac.nowcoder.com/acm/contest/392/D 来源:牛客网 月月给华华出题 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K, ...
- 牛客小白月赛12 C 华华给月月出题 (积性函数,线性筛)
链接:https://ac.nowcoder.com/acm/contest/392/C 来源:牛客网 华华给月月出题 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K, ...
- 【ACM算法竞赛日常训练】DAY10题解与分析【月月给华华出题】【华华给月月出题】| 筛法 | 欧拉函数 | 数论
DAY10共2题: 月月给华华出题 华华给月月出题 难度较大. 作者:Eriktse 简介:211计算机在读,现役ACM银牌选手力争以通俗易懂的方式讲解算法!️欢迎关注我,一起交流C++/Python ...
- 牛客网 牛客小白月赛12 B.华华教月月做数学-A^B mod P-快速幂+快速乘
链接:https://ac.nowcoder.com/acm/contest/392/B来源:牛客网 华华教月月做数学 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其 ...
- E.华华给月月准备礼物
链接:https://ac.nowcoder.com/acm/contest/392/E 题意: 二月中旬虐狗节前夕,华华决定给月月准备一份礼物.为了搭建礼物的底座,华华需要若干根同样长的木棍.华华手 ...
随机推荐
- 一个基于.NET Core开源、跨平台的仓储管理系统
前言 今天给大家推荐一个基于.NET Core开源.跨平台的仓储管理系统,数据库支持MSSQL/MySQL:ZEQP.WMS. 仓储管理系统介绍 仓储管理系统(Warehouse Management ...
- 探索 Web API:SpeechSynthesis 与文本语言转换技术
一.引言 随着科技的不断发展,人机交互的方式也在不断演变.语音识别和合成技术在人工智能领域中具有重要地位,它们为残障人士和日常生活中的各种场景提供了便利.Web API 是 Web 应用程序接口的一种 ...
- [ABC265G] 012 Inversion
Problem Statement You are given a sequence $A=(A_1,\ldots,A_N)$ of length $N$. Each element is $0$, ...
- vue-test4 -------组件之间的数据传递
<template> <h3>CompA</h3> <component-b :onfun="dateFun"></compo ...
- SpringBoot整合EasyExcel
1.Excel导入导出的应用场景 在做项目中很多时候都会用到Excel的导入和导出 2.解决方案 POI:操作比较繁琐 EasyExcel:正如其名,'Easy'Excel相对于POI使用起来还是比较 ...
- Scrapy自带的断点续爬JOB-DIR参数
参考官方文档:https://docs.scrapy.org/en/latest/topics/jobs.html?highlight=JOBDIR#jobs-pausing-and-resuming ...
- 数字孪生和GIS融合会为各自带来什么样的改变?
数字孪生和地理信息系统(GIS)是两个强大的技术,它们在各自领域发挥着重要作用.而当数字孪生与GIS融合时,将会为它们带来更加深远的改变和增益. 数字孪生技术以数字化的方式模拟和复制现实世界中的物理对 ...
- Cesium最简单的视效升级方案,无需修改代码即可实现
Cesium依靠其开源免费的特点基本上完全垄断了GIS这一块,并且其中99%的用户都是使用的CesiumJS,然而,对于一些使用Cesium的项目来说,要想升级视效可能需要进行繁琐的代码修改,增加了开 ...
- STM32CubeMX教程4 EXTI 按键外部中断
1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 2 ...
- 深入了解RC4 Drop加密技术
一.引言 在网络安全领域,加密技术始终是重中之重.随着计算机技术的发展,加密算法也在不断更新换代.RC4(Rivest Cipher 4)加密算法因其高效.简洁的特性,在信息安全领域得到了广泛的应用. ...