传送门

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

  2019南昌邀请赛网络预选赛M.cpp

坑点

  起初,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的更多相关文章

  1. 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( ...

  2. 2019南昌邀请赛网络预选赛 J.Distance on the tree(树链剖分)

    传送门 题意: 给出一棵树,每条边都有权值: 给出 m 次询问,每次询问有三个参数 u,v,w ,求节点 u 与节点 v 之间权值 ≤ w 的路径个数: 题解: 昨天再打比赛的时候,中途,凯少和我说, ...

  3. POJ-2796 & 2019南昌邀请赛网络赛 I. 区间最大min*sum

    http://poj.org/problem?id=2796 https://nanti.jisuanke.com/t/38228 背景 给定一个序列,对于任意区间,min表示区间中最小的数,sum表 ...

  4. 2019南昌邀请赛网络赛:J distance on the tree

    1000ms 262144K   DSM(Data Structure Master) once learned about tree when he was preparing for NOIP(N ...

  5. [2019南昌邀请赛网络赛D][dp]

    https://nanti.jisuanke.com/t/38223 Xiao Ming recently indulges in match stick game and he thinks he ...

  6. 南昌邀请赛网络赛 D.Match Stick Game(dp)

    南昌邀请赛网络赛 D.Match Stick Game 题目传送门 题目就会给你一个长度为n的字符串,其中\(1<n<100\).这个字符串是一个表达式,只有加减运算符,然后输入的每一个字 ...

  7. 2019 ICPC南昌邀请赛网络赛比赛过程及题解

    解题过程 中午吃饭比较晚,到机房lfw开始发各队的账号密码,byf开始读D题,shl电脑卡的要死,启动中...然后听到谁说A题过了好多,然后shl让blf读A题,A题blf一下就A了.然后lfw读完M ...

  8. icpc 南昌邀请赛网络赛 Subsequence

    题目链接:https://nanti.jisuanke.com/t/38232 就是判断输入是不是子序列 没想到贡献了将近十几次罚时..........可以说是菜的真实了 用cin cout超时了 改 ...

  9. 2019 ICPC南昌邀请赛 网络赛 K. MORE XOR

    说明 \(\oplus x​\)为累异或 $ x^{\oplus(a)}​$为异或幂 题意&解法 题库链接 $ f(l,r)=\oplus_{i=l}^{r} a[i]$ $ g(l,r)=\ ...

随机推荐

  1. cmd的变量总结

    转自:https://blog.csdn.net/flyoutsan/article/details/52811095 cmd变量通过set设置变量,通过可以使用set /?查看有关变量的帮助文档. ...

  2. SQL学习笔记---常用命令

    常用命令 变量 1.声明 declare @变量名 类型,… 2.赋值 1.同时赋值多个变量(可以结合查询) select @变量名=表达式1,表达式2 2.单个赋值(推荐) set @变量名=表达式 ...

  3. Proxmox VE登陆的时候提示没有有效的订阅You do not have a valid subscription for this server. Please visit www.proxmox.com to get a list of available options.

    问题描述: 用的是免费版的,所以每次都提示这个没有有效的订阅挺烦的 解决方法: 修改文件/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib. ...

  4. MySQL 数据查询

    SELECT子句:用来指定查询返回字段,星号(*)表示返回所有字段 SELECT  [DISTINCT]*|字段列表        #DISTINCT 用来过滤重复数据 FROM子句:用来指定数据来源 ...

  5. 英语口语练习系列-C02-抱怨

    连接到英语口语系列总分类 连接到上一章棒棒的 竹石 郑燮 zhèng xiè 竹石 作者:郑燮 咬定青山不放松,立根原在破岩中. 千磨万击还坚劲,任尔东西南北风. Our team sucks. 我们 ...

  6. 微信小程序测试

    1.连接真机,微信已经登录过了 2.代码: 3.appium自带的识别工具 4.设置工具连接设备的方式 参考资料: https://www.cnblogs.com/yoyoketang/p/91449 ...

  7. leetcode 169. Majority Element 、229. Majority Element II

    169. Majority Element 求超过数组个数一半的数 可以使用hash解决,时间复杂度为O(n),但空间复杂度也为O(n) class Solution { public: int ma ...

  8. HyperLedger Fabric ChainCode开发——shim.ChaincodeStubInterface用法

    深蓝前几篇博客讲了Fabric的环境搭建,在环境搭建好后,我们就可以进行Fabric的开发工作了.Fabric的开发主要分成2部分,ChainCode链上代码开发和基于SDK的Application开 ...

  9. PySocks安装使用方法

    PySocks是一个基于Python的SOCKS代理客户端,它是SocksiPy的一个分支,修改了一些bug和增加了一些额外功能. ---------------------------------- ...

  10. 互怼、IPO、雷潮、寒冬,2018 互联网圈的那些事儿

    有了人的地方,就会有江湖. 有江湖的地方,就会有门派. 有门派的地方,就会有纷争. 有纷争的地方,就会有兴衰. 2018年马上就要离我们远去了,迎接我们的将会是新的一年——2019年.在整个过去的20 ...