2019南昌邀请赛网络预选赛 M. Subsequence
M. Subsequence(思维)
•题意
给出一个只包含小写字母的字符串 $s$;
接下来给你和 n 个 串 $t_{1,2,...,n}$,判断第 i 个串 $t_i$ 是否为 串 s 的子序列;
如果是,输出"YES",反之,输出"NO";
•题解
将 $s$ 中 26 个字母出现的位置分别记录下来;
我放在了 vector<> 中;
int n=strlen(s+);///个人习惯,s下标从1开始
for(int i=;i <= n;++i)
v[s[i]-'a'].push_back(i);假设当前要找的串 $t$ 长度为 m;
那么,在匹配 $t_1$ 时,只需判断一下 $v[t_1 -\ 'a'].size()$ 是否大于 0 即可;
如果 > 0 ,那么 $t_1$ 就匹配 $s$ 中的 $v[t_1 -\ 'a'][0]$ 位置;
并定义 $pre=v[t_1 -\ 'a'][0]$,记录一下之前匹配好的位置;
接下来匹配 $t_2$,类似 $t_1$ 的匹配;
但是这次不仅要判断 $v[t_2 -\ 'a'].size()$ 是否大于 0,还需要找到 $v[t_2 -\ 'a']$ 是否存在 > pre 的值;
因为 $t_2$ 在 $s$ 中匹配的位置势必要在 $t_1$ 之后,如果找到,更新 pre = $t_2$ 匹配的位置;
然后,根据如上方式匹配 $t_2 , t_3 , \cdots , t_m$;
存在匹配不成功的地方,就返回 false;
我是将这个匹配方式放到了 Find() 函数里的;
定义数组 a,$a_i$ 表示 $'a'+i$ 字符在 v 中匹配到的位置;
bool Find()
{
int m=strlen(t+); mem(a,);
int pre=;
for(int i=;i <= m;++i)
{
int x=t[i]-'a';
///在v[x]中查找第一个 > pre 的位置
for(;a[x] < v[x].size() && v[x][a[x]] <= pre;a[x]++); ///匹配失败,返回false
if(a[x] == v[x].size())
return false;
///匹配成功,更新pre
pre=v[x][a[x]];
}
return true;
}•Code
•坑点
起初,Find() 函数里,在 v[x] 中查找第一个 > pre 的位置时我用的方法是在 v[x] 中二分查找;
auto it=upper_bound(v[x].begin(),v[x].end(),pre);每次判断 it 是否为 v[x].end();
一直TLE可还行;
这种题就是用来卡二分的么,可记住了;
•相似题(分割线:2019.6.21)
类比Codeforces #565C 这道题,发现,这两道题有异曲同工之妙;
首先,再分析一下本题的做法:
在 s串中找 t串,如果找到,输出 "YES",反之,输出 "NO";
如果将题意改为查找 s串 中最多有多少个 t串 呢?
在类比一下Codeforces这道题,是不是发现两者的做法一样呢?
•Code
#include<bits/stdc++.h>
using namespace std;
#define memF(a,b,n) for(int i=0;i <= n;a[i++]=b);
const int maxn=1e5+; char s[maxn];
char t[maxn];
int a[];
vector<int >p[];///存储字母在s中出现的位置 char *Solve()
{
memF(a,,); int len=strlen(t+);
int cur=;
for(int i=;i <= len;++i)
{
int index=t[i]-'a';
for(;a[index] < p[index].size() && p[index][a[index]] <= cur;a[index]++);
if(a[index] == p[index].size())
return "NO";
cur=p[index][a[index]];
}
return "YES";
}
void Init()
{
for(int i=;i < ;++i)
p[i].clear();
int len=strlen(s+);
for(int i=;i <= len;++i)
p[s[i]-'a'].push_back(i);
}
int main()
{
scanf("%s",s+);
Init(); int test;
scanf("%d",&test);
while(test--)
{
scanf("%s",t+);
puts(Solve());
}
return ;
}
2019南昌邀请赛网络预选赛 M. Subsequence的更多相关文章
- 2019南昌邀请赛网络预选赛 I. Max answer(单调栈+暴力??)
传送门 题意: 给你你一序列 a,共 n 个元素,求最大的F(l,r): F(l,r) = (a[l]+a[l+1]+.....+a[r])*min(l,r); ([l,r]的区间和*区间最小值,F( ...
- 2019南昌邀请赛网络预选赛 J.Distance on the tree(树链剖分)
传送门 题意: 给出一棵树,每条边都有权值: 给出 m 次询问,每次询问有三个参数 u,v,w ,求节点 u 与节点 v 之间权值 ≤ w 的路径个数: 题解: 昨天再打比赛的时候,中途,凯少和我说, ...
- POJ-2796 & 2019南昌邀请赛网络赛 I. 区间最大min*sum
http://poj.org/problem?id=2796 https://nanti.jisuanke.com/t/38228 背景 给定一个序列,对于任意区间,min表示区间中最小的数,sum表 ...
- 2019南昌邀请赛网络赛:J distance on the tree
1000ms 262144K DSM(Data Structure Master) once learned about tree when he was preparing for NOIP(N ...
- [2019南昌邀请赛网络赛D][dp]
https://nanti.jisuanke.com/t/38223 Xiao Ming recently indulges in match stick game and he thinks he ...
- 南昌邀请赛网络赛 D.Match Stick Game(dp)
南昌邀请赛网络赛 D.Match Stick Game 题目传送门 题目就会给你一个长度为n的字符串,其中\(1<n<100\).这个字符串是一个表达式,只有加减运算符,然后输入的每一个字 ...
- 2019 ICPC南昌邀请赛网络赛比赛过程及题解
解题过程 中午吃饭比较晚,到机房lfw开始发各队的账号密码,byf开始读D题,shl电脑卡的要死,启动中...然后听到谁说A题过了好多,然后shl让blf读A题,A题blf一下就A了.然后lfw读完M ...
- icpc 南昌邀请赛网络赛 Subsequence
题目链接:https://nanti.jisuanke.com/t/38232 就是判断输入是不是子序列 没想到贡献了将近十几次罚时..........可以说是菜的真实了 用cin cout超时了 改 ...
- 2019 ICPC南昌邀请赛 网络赛 K. MORE XOR
说明 \(\oplus x\)为累异或 $ x^{\oplus(a)}$为异或幂 题意&解法 题库链接 $ f(l,r)=\oplus_{i=l}^{r} a[i]$ $ g(l,r)=\ ...
随机推荐
- Git命令备忘
最近在用Git,查了点相关资料,逻辑依然不太明了,先整理一部分备忘,以后补充 一.本地Git与Github/码云的关联 1. 设置本地用户名,邮箱 git config --global user.n ...
- iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包
本文章将从两个方向分别介绍 OC 与 swift 混编 1. 第一个方向从 swift工程 中引入 oc类 1. 1 如何在swift的类中使用oc类 1.2 如何在swift中实现oc的代理 ...
- Extjs 改变grid行的背景颜色
## Ext grid 改变行背景色 Ext.util.CSS.createStyleSheet('.ts {background:#9a9a9bc2;}');//单独创建css样式 { xtype: ...
- 【Teradata】安装SQL Assistant和Administrator 16.20(含查看.net版本)
1.安装介质获取: 获取的路径:connections==>Gateways==>Customer Services==>TOOLS & APPLICATIONS(点击Mor ...
- PHP命令执行与防范
命令执行漏洞是指攻击者可以随意执行系统命令,是高危漏洞之一. 命令连接符:& && || | 如:ping www.baidu.com && ne ...
- Visual Studio中Image Watch的使用
Imag watch的简介 Image Watch是一个VS插件,能够让你在调试一个OpenCV程序的时候,看到内存中的图像,这对跟踪bug或者理解一段代码非常有帮助.(原文:Image Watch ...
- Android测试(四):Instrumented 单元测试
原文:https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html Instrume ...
- 私有云方案——利用阿里云云解析实现DDNS
各位都是程序员,工作中是不是遇到个类似情况.在家里研究的一些开源代码或写的一些demo或试验代码,在工作中正好需要参考一下,但是在家里的电脑上. 虽然这些都可以用云 ...
- centos6.8 配置mysql赋予mysql远程连接权限
1.关掉防火墙 2.检查3306端口是否开放 3.修改用户用户权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '您的数据库密码' ...
- vue应用或者是项目其实就是 实例(完成基本逻辑) + 组件(单文件组件,全局组件,局部组件,内置组件)来完成 ;
以上! 组件里面包含HTML,css, js,也就是一个完整的功能!
