【每日一题】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 题意: 二月中旬虐狗节前夕,华华决定给月月准备一份礼物.为了搭建礼物的底座,华华需要若干根同样长的木棍.华华手 ...
随机推荐
- 地图选择器datav怎么使用?
DataV 是一款基于阿里云的数据可视化产品,它提供了丰富的组件和功能,其中包括地图选择器.下面是一个详细的介绍: 1. 了解 DataV: - DataV 是一款强大的数据可视化工具,能够帮助用户将 ...
- 使用CompletableFuture实现多个异步任务并行完成后合并结果
业务场景 需要同时从多个副本数据库中查询数据,并对查询结果进行合并去重处理后返回前端. 实现过程涉及多数据源切换,这里不作过多讨论. 编码实现 实现过程: 1.定义异步查询数据方法: 2.通过Comp ...
- springboot整合kafka,收不到消息,日志输出dead for group解决方法
项目启动以后收不到Kafka发出的消息,日志输出类似: INFO [org.springframework.kafka.KafkaListenerEndpointContainer#1-7-C-1] ...
- K8s 里多容器 Pod 的健康检查探针工作机制分析
目录 1. 开篇 2. 聊啥 3. 结论(TL;DR) 4. 测试过程 4.1 准备测试用镜像 4.2 准备 Deployment YAML 4.3 准备 Service YAML 4.4 准备第二个 ...
- C++ Qt开发:StringListModel字符串列表映射组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QString ...
- 华为防火墙1day?
背景信息 缺省情况下,FW通过8887端口提供内置的本地Portal认证页面,用户可以主动访问或HTTP重定向至认证页面(https://接口IP地址:8887)进行本地Portal认证. 当企业部署 ...
- 数字孪生结合GIS能够为城市灾害预防工作提供什么帮助?
数字孪生技术结合GIS(地理信息系统)在城市灾害预防工作中发挥着重要的作用,为城市的安全和可持续发展提供了关键帮助.数字孪生是一种将现实世界与数字虚拟世界相结合的技术,可以帮助城市规划者和管理者更好地 ...
- 【OpenCV】【Python】关于cv2.findContours()轮廓索引(编号)解析(RETR_TREE)
在打算自己实现二维码的定位的时候,看到了相关博文的关于cv2.findContours返回的层级信息来定位三个"回"字从而达到定位二维码的目的,但是返回的hierarchy中的层级 ...
- 已解决:若依更换日志EasyExcel框架导出报错 java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader
先描述一下当时的场景 回忆 看到出错了,我就想可能是哪个路径写错了,或者导依赖名字写对,或者说是多了少了标点符号什么的. 然而,还是想简单了,检查重启后发现问题并没有解决. 于是就把所有我改过的地方检 ...
- 2023总结与展望--Empirefree
今年一篇博客都没写过了,好像完全在忙在工作和生活上面了,珍惜自我,保持热情,2024对我好点 目录 1. 年终总结 1.1.学习工作计划 1.2. 生活计划 1.3 个人总结 2. 未来展望 1. 年 ...