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. [.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢?

    [.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢? 在ASP.NET Core应用程序中,接 ...

  2. Not Adding - 题解【数学,枚举】

    题面 原题链接(CF1627D) You have an array \(a_1,a_2,-,a_n\) consisting of \(n\) distinct integers. You are ...

  3. UI自动化滑动登录

    一.使用OpenCV图像识别函数 1 import time 2 import cv2 3 import requests 4 from selenium import webdriver 5 fro ...

  4. 【Azure Developer】使用 adal4j(Azure Active Directory authentication library for Java)如何来获取Token呢

    问题描述 使用中国区的Azure,在获取Token时候,参考了 adal4j的代码,在官方文档中,发现了如下的片段代码: ExecutorService service = Executors.new ...

  5. 审计 Linux 系统的操作行为的 5 种方案对比

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 很多时候我们为了安全审计或者故障跟踪排错,可能会记录分析 ...

  6. Unity实现简单的对象池

    一.简介 先说说为什么要使用对象池 在Unity游戏运行时,经常需要生成一些物体,例如子弹.敌人等.虽然Unity中有Instantiate()方法可以使用,但是在某些情况下并不高效.特别是对于那些需 ...

  7. react 疑问集锦

    在 setState 后未 re-render function component 初始化调用接口

  8. spring boot 统一接口异常返回值

    创建业务 Exception 一般在实际项目中,推荐创建自己的 Exception 类型,这样在后期会更容易处理,也比较方便统一,否则,可能每个人都抛出自己喜欢的异常类型,而造成代码混乱 Servic ...

  9. 组织:ITU

    国际电信联盟(International Telecommunication Union -- ITU)是联合国专门机构之一,主管信息通信技术事务,由无线电通信.标准化和发展三大核心部门组成,其成员包 ...

  10. 好客租房21-react组件的两种创建方式(函数组件)

    1使用函数创建组件 函数组件:使用js的函数或者箭头函数创建的组件 约定1:函数组件名称必须以 开头 约定2:函数组件必须有返回值 表示该组件的结构 如果返回值为null 表示不渲染任何内容 2.1使 ...