NC23053 月月查华华的手机
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 月月查华华的手机的更多相关文章
- 牛客小白月赛12 J 月月查华华的手机(序列自动机)
---恢复内容开始--- 题目来源:https://ac.nowcoder.com/acm/contest/392/J 题意: 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机. ...
- 牛客小白月赛12 J 月月查华华的手机 (序列自动机模板题)
链接:https://ac.nowcoder.com/acm/contest/392/J 来源:牛客网 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机.月月出于人类最单纯的好奇 ...
- Newcoder 华华给月月出题(线筛)题解
题目描述: 华华刚刚帮月月完成了作业.为了展示自己的学习水平之高超,华华还给月月出了一道类似的题: Ans=⊕Ni=1(iNmod(109+7))Ans=⊕i=1N(iNmod(109+7)) ⊕⊕符 ...
- 牛客网 牛客小白月赛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 题意: 二月中旬虐狗节前夕,华华决定给月月准备一份礼物.为了搭建礼物的底座,华华需要若干根同样长的木棍.华华手 ...
- B.华华教月月做数学
链接:https://ac.nowcoder.com/acm/contest/392/B 题意: 找到了心仪的小姐姐月月后,华华很高兴的和她聊着天.然而月月的作业很多,不能继续陪华华聊天了.华华为了尽 ...
- 牛客小白月赛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, ...
- NC23046 华华教月月做数学
NC23046 华华教月月做数学 题目 题目描述 找到了心仪的小姐姐月月后,华华很高兴的和她聊着天.然而月月的作业很多,不能继续陪华华聊天了.华华为了尽快和月月继续聊天,就提出帮她做一部分作业. 月月 ...
随机推荐
- 倒数第N个字符
一. 题目描述 给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增.例如当 L 为 3 时,序列为 { aaa, aab ...
- 没错,华为开始对IoT下手了!
最近,有很多粉丝在后台私信 想知道目前最热的技术是什么? 小编觉得,5G时代到来 物联网技术将迎来快速的发展 加上目前,国内物联网人才短缺 每年人才缺口达百万 IoT物联网将成为最热门的技术 最近,小 ...
- linux下nginx软件的学习
参考博客 1.nginx是什么 nginx是一个开源的,支持高性能,高并发的web服务和代理服务软件.它是开源的软件. nginx比它大哥apache性能改进许多,nginx占用的系统资源更少,支持更 ...
- Event Loop 是什么?
Event Loop 是什么? 本文写于 2020 年 12 月 6 日 广义上来说 Event Loop 并不是 JavaScript 独有的概念,他是一个计算机的通用概念. 狭义上来说,只有 No ...
- 关于linux多线程fork的理解和学习
fork在英文中是"分叉"的意思.为什么取这个名字呢?因为一个进程在运行中,如果使用了fork函数,就产生了另一个进程,于是进程就"分叉"了,所以这个名字取得很 ...
- Element中Tree树结构组件中实现Ctrl和Shift多选
在Element中的树结构中, 实现多选功能,首先的是判断有没有按下键盘ctrl和shift按键.但是在Element中的tree组件的左键点击事件是没有提供$event鼠标属性判断的.所以就需要在函 ...
- css页面样式初始化
为什么? 同一个样式,在各个浏览器的默认样式可能不同,所以需要统一初始化,同一个页面在不同浏览器能正常显示. @charset "utf-8"; /*css reset*/ bod ...
- Eoapi — 一个可拓展的开源 API 工具
在社区中时常会出现"抱怨某商业产品越来越臃肿"的声音,API 工具也是如此.从最早期只做 API 调试的工具,到经过多年的演进后集成全面功能的"庞然大物", ...
- Bean Validator
Bean Validator 关于Jakarta EE 2018年03月, Oracle 决定把 JavaEE 移交给开源组织 Eclipse 基金会,并且不再使用Java EE这个名称. 因此jav ...
- 3. Docker应用