NC23053 月月查华华的手机

题目

题目描述

月月和华华一起去吃饭了。期间华华有事出去了一会儿,没有带手机。月月出于人类最单纯的好奇心,打开了华华的手机。哇,她看到了一片的QQ推荐好友,似乎华华还没有浏览过。月月顿时醋意大发,出于对好朋友的关心,为了避免华华浪费太多时间和其他网友聊天,她要删掉一些推荐好友。但是为了不让华华发现,产生猜疑,破坏了他们的友情,月月决定只删华华有可能搭讪的推荐好友。

月月熟知华华搭讪的规则。华华想与某个小姐姐搭讪,当且仅当小姐姐的昵称是他的昵称的子序列。为了方便,华华和小姐姐的昵称只由小写字母构成。为了更加方便,保证小姐姐的昵称长度不会比华华的长。

现在月月要快速的判断出哪些推荐好友要删掉,因为华华快回来了,时间紧迫,月月有点手忙脚乱,所以你赶紧写个程序帮帮她吧!

输入描述

第一行输入一个字符串 \(A\) 表示华华的昵称。

第二行输入一个正整数 \(N\) 表示华华的推荐好友的个数。

接下来 \(N\) 行,每行输入一个字符串 \(B_i\) 表示某个推荐好友的昵称。

输出描述

输出 \(N\) 行,对于第 \(i\) 个推荐好友,如果华华可能向她搭讪,输出 Yes,否则输出 No

注意大写,同时也要注意输出效率对算法效率的影响。

示例1

输入

noiauwfaurainairtqltqlmomomo
8
rain
air
tql
ntt
xiaobai
oiiiooo
orzcnzcnznb
ooooo

输出

Yes
Yes
Yes
Yes
No
Yes
No
No

备注

\(1\le|A|\le10^6\) ,\(1\le N\le10^6\),\(1\le\sum_{i=1}^NB_i\le10^6\)

题解

思路

知识点:指针优化。

如果对每个待匹配字符串 \(B_i\) 都用普通双指针搜索一遍完整的字符串 \(A\) ,那么时间复杂度将会是 \(O(\lvert A \rvert N)\) ,显然是不行的。(但不知道为什么这里能过而且还比正解快QWQ)。

因为每次都是对同一个字符串匹配,可以考虑整合字符串中有用的信息优化双指针的遍历。我们希望每次在字符串 \(A\) 的指针能更快的到达下一个需要并且存在的字母,即需要预处理某字母当前位置往后第一个位置。因此,考虑用数组 \(nxt[i][j]\) 表示第 \(i\) 位往后第一次出现字母 \((j+'a')\) 的位置。

因为需要知道最近一次的出现的位置,正着预处理肯定不好因为无法确定某个位置下一个某字母出现在哪里,而可以倒着预处理可以解决这个问题,因为后面的都已经遍历过了(大部分处理下一个位置枚举都是逆着来的),考虑用数组 \(last[i]\) 表示目前字母 \((i+'a')\) 最近的位置。注意在一个位置 \(i\) 要先将 \(last[0 \cdots 25 ]\) 赋给 \(nxt[i][0 \cdots 25]\) ,再处理 \(last\) ,不存在就赋值为 \(-1\)。

最后,遍历 \(B_i\) 注意一些小细节即可。

时间复杂度 \(O(\lvert A \rvert + N)\)

空间复杂度 \(O(\lvert A \rvert)\)

代码

#include <bits/stdc++.h>

using namespace std;

int last[26+7];
int nxt[1000007][26+7]; int main(){
string str;
cin>>str;
memset(last,-1,sizeof(last));
for(int i = str.length()-1;i>=0;i--){
for(int j = 0;j<26;j++){
nxt[i][j] = last[j];
}
last[str[i]-'a'] = i;
}
int n;
cin>>n;
while(n--){
string s;
cin>>s;
int pos = last[s[0]-'a'];///先手动找到第一个起始位置,后面迭代即可
bool ok = ~pos;
for(int i = 1;i<s.length() && ok;i++) ok = ~(pos = nxt[pos][s[i]-'a']);
if(ok) cout<<"Yes"<<'\n';
else cout<<"No"<<'\n';
}
return 0;
}

NC23053 月月查华华的手机的更多相关文章

  1. 牛客小白月赛12 J 月月查华华的手机(序列自动机)

    ---恢复内容开始--- 题目来源:https://ac.nowcoder.com/acm/contest/392/J 题意: 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机. ...

  2. 牛客小白月赛12 J 月月查华华的手机 (序列自动机模板题)

    链接:https://ac.nowcoder.com/acm/contest/392/J 来源:牛客网 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机.月月出于人类最单纯的好奇 ...

  3. Newcoder 华华给月月出题(线筛)题解

    题目描述: 华华刚刚帮月月完成了作业.为了展示自己的学习水平之高超,华华还给月月出了一道类似的题: Ans=⊕Ni=1(iNmod(109+7))Ans=⊕i=1N(iNmod(109+7)) ⊕⊕符 ...

  4. 牛客网 牛客小白月赛12 B.华华教月月做数学-A^B mod P-快速幂+快速乘

    链接:https://ac.nowcoder.com/acm/contest/392/B来源:牛客网 华华教月月做数学 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其 ...

  5. E.华华给月月准备礼物

    链接:https://ac.nowcoder.com/acm/contest/392/E 题意: 二月中旬虐狗节前夕,华华决定给月月准备一份礼物.为了搭建礼物的底座,华华需要若干根同样长的木棍.华华手 ...

  6. B.华华教月月做数学

    链接:https://ac.nowcoder.com/acm/contest/392/B 题意: 找到了心仪的小姐姐月月后,华华很高兴的和她聊着天.然而月月的作业很多,不能继续陪华华聊天了.华华为了尽 ...

  7. 牛客小白月赛12 D 月月给华华出题 (欧拉函数,数论,线筛)

    链接:https://ac.nowcoder.com/acm/contest/392/D 来源:牛客网 月月给华华出题 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K, ...

  8. 牛客小白月赛12 C 华华给月月出题 (积性函数,线性筛)

    链接:https://ac.nowcoder.com/acm/contest/392/C 来源:牛客网 华华给月月出题 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K, ...

  9. NC23046 华华教月月做数学

    NC23046 华华教月月做数学 题目 题目描述 找到了心仪的小姐姐月月后,华华很高兴的和她聊着天.然而月月的作业很多,不能继续陪华华聊天了.华华为了尽快和月月继续聊天,就提出帮她做一部分作业. 月月 ...

随机推荐

  1. Spring 源码(3)Spring BeanFactory 是怎么创建的?

    Spring创建 BeanFactory 的方式 按照Bean的配置方式手动创建可以分为两种: 使用XMl配置的Bean 这种方式使用xml配置文件配置Bean的信息并且设置扫描的路径,扫描到的包可以 ...

  2. FreeRTOS --(5)内存管理 heap4

    FreeRTOS 中的 heap 4 内存管理,可以算是 heap 2 的增强版本,在 <FreeRTOS --(3)内存管理 heap2>中,我们可以看到,每次内存分配后都会产生一个内存 ...

  3. Java 15 新特性:文本块

    大家好,我是DD,今天继续来学点Java的新特性! 假设有这样一个场景,我们需要做一个工具.用来自动生成项目文档,文档可以通过浏览器查看,所以最后产出物肯定是一堆html文件.为了让这些html文件更 ...

  4. Redis源码漂流记(二)-搭建Redis调试环境

    Redis源码漂流记(二)-搭建Redis调试环境 一.目标 搭建Redis调试环境 简要理解Redis命令运转流程 二.前提 1.有一些c知识简单基础(变量命名.常用数据类型.指针等) 可以参考这篇 ...

  5. 沁恒CH32V103C8T6开发环境笔记

    CH32V103C8T6 CH32V103C8T6是沁恒的RISC-V内核MCU, 基于RISC-V3A处理器, 内核采用2级流水线处理,设置了静态分支预测.指令预取机制,支持DMA. 主要参数如下 ...

  6. python操作MySQL、事务、SQL注入问题

    python操作MySQL python中支持操作MySQl的模块很多 其中最常见就是'pymysql' # 属于第三方模块 pip3 install pymysql # 基本使用 import py ...

  7. HMS Core使能AI智慧体验,共建创新应用生态

    5月17日,2022年搜狐科技峰会成功举办,峰会汇聚各界大咖,共同探讨AI 技术的深入应用以及行业数字化的发展趋势.华为终端云服务应用生态BU总裁望岳发表题为<使能AI智慧体验,共建创新应用生态 ...

  8. ubuntu 获取 gateway 网关 ip

    输入以下命令,第一行中 Gateway 列就是网关 IP netstat -rn

  9. 使用echo 无法正确清空文件存储大小

    在使用echo进行重定向文件的时候,会存在大小没有发生改变的现象 使用上面的方法遇到一个现象 ls -l 与 du -sh 得到的大小事是不同的 可以尝试下面的方面之后在进行对比 再看是否正确清除 使 ...

  10. Windows环境下启动Redis报错:Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。(已解决)

    问题描述: 今天在windows环境下启动Redis时启动失败报错: 解决方案: ①运行命令:redis-cli.exe ②退出Redis ③运行命令:redis-server.exe redis.w ...