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

•题意

给出一个只包含小写字母的串 s 和n 个串t,判断t[i]是否为串 s 的子序列;

如果是,输出"YES",反之,输出"NO";

•思路

可以把s串中每一个字母的位置预处理出来。(由于总长度是1e5,可能有26个字母,用数组存[26][100000]显然是不可能的,所以就用vector动态分配一下(QwQ)

然后设置一个指针cur,指向当前字母的位置。

再开一个数组记录一下使用后的每个字母的最后一个位置,为了避免每次从第一个开始找。

•代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+5;

vector<int> p[27];
char s[maxn];
char t[maxn];
int a[27];//记录使用后的每个字母的最后一个位置,即这个字母到达的最远的位置
          //后面再找这个字母时,从这个位置的下一个开始找,可以减少查找量

int main()
{
    scanf("%s",s);
    int n=strlen(s);
    for(int i=0;i<n;i++)
        p[s[i]-‘a‘].push_back(i);//预处理s串每个字母的位置

    int kase;
    scanf("%d",&kase);
    while(kase--)
    {
        memset(a,0,sizeof a);
        int cur=-1;//初始化为-1 因为从0开始
        scanf("%s",t);
        int m=strlen(t);
        int flag;//判断每个字母能不能找到符合要求的
        for(int i=0;i<m;i++)
        {
            flag=0;
            int x=t[i]-‘a‘;
            for(int j=a[x];j<p[x].size();j++)
            {
                if(p[x][j]>cur)//在s串中找x出现的位置 >cur 的第一个位置,有点贪心的感jio
                {
                    cur=p[x][j];//更新cur
                    a[x]=j+1;//记录之前x到达的最远位置j,后面从j+1开始找
                    flag=1;
                    break;
                }
            }
            if(!flag)//没找到需要的字母,肯定t串就不存在
                break;
        }
        if(!flag)
            printf("NO\n");
        else
            printf("YES\n");
    }
}

原文地址:https://www.cnblogs.com/MMMinoz/p/11073404.html

时间: 2024-10-08 09:17:41

2019南昌邀请赛网络预选赛 M. Subsequence的相关文章

2019.4.20南昌邀请赛网络预选赛

The Preliminary Contest for ICPC China Nanchang National Invitational 他人博客题解:戳这里 原文地址:https://www.cnblogs.com/QLU-ACM/p/10743125.html

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

南昌邀请赛网络赛 D.Match Stick Game 题目传送门 题目就会给你一个长度为n的字符串,其中\(1<n<100\).这个字符串是一个表达式,只有加减运算符,然后输入的每一个字符都是可以由若干个火柴棒拼接而成的. 现在在不改变每个数的位数,数的总数以及运算符的个数的前提下,可以对火柴棒重新拼接.询问最后可以拼接出来的最大值是多少. 这个自己看下题目可能要清楚一些= = ? 每一个字符都是由若干个火柴棒构成的,我们可以考虑类似于背包的思路来求解. 因为每个数的位数最后都没发生变化,所

2019南昌icpc网络赛 I题 分块套BIT

https://nanti.jisuanke.com/t/41356 对于带修的二维数点,可以bit套主席树,也可CDQ三维偏序 但是最后我选择分块套BIT暴力... 复杂度为$m(blocksize*logn+blocknum)$ 显然,如果按照$\sqrt{n}$分块,并不是最优的 我们可以适当的增加块的大小,减少块的数量,让$blocksize*logn=blocknum$ 在这个题中,大概就是$\sqrt{1e6}$到$\sqrt{2e6}$之间吧 #include<bits/stdc+

ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询问子区间中某个值域的数的个数,连续的相同数字只记为一个.(即统计数字段的个数) 2 L R x y 数据范围: 1 ≤ n,m ≤ 2×10^5 1 ≤ a[i] ≤ n 解题思路: 连续重复的数字只记一次.所以考虑将每个数字段除第一个出现外的数字都删去(记为0).在读入操作的时候暴力模拟,同时维护

icpc南昌邀请赛 比赛总结

上周末,我参加了icpc南昌区域赛邀请赛,这也是我的第一次外出参赛. 星期五晚上,在6个小时的火车和1个小时的公交后,我们终于抵达了江西师范大学,这次的比赛场地.江西师范大学周围的设施很齐全,各种烧烤,大型商场,地铁应有尽有,去酒店办好入住手续,放下东西后,我们便去吃饭,听说南昌的小龙虾很不错,我们就选择了一家烧烤店吃起了烧烤.还是很高兴的,就是因为吃太多了晚上睡不着有点休息不好. 第二天早上,大家都起到很晚,我9点钟醒时还没有人醒,等到10:30我们一起去签到,收获了自己的第一件参赛衣服,同时

ACM-ICPC 2018南京赛区网络预选赛

A题:An Olympian Math Problem 可以发现最终的答案就是n-1 1 #include <iostream> 2 #include<bits/stdc++.h> 3 using namespace std; 4 typedef long long ll; 5 int main() 6 { 7 int t; 8 ll n; 9 scanf("%d",&t); 10 while(t--) 11 { 12 scanf("%lld&

2019年上半年网络工程师考试上午试题分析

2019年上半年网络工程师考试上午试题结构分析 1.整体难度偏难:出现部分超纲题目.如位示图,有限自动机等与软件设计师的题目完全一样,对于网络工程师考试来说,确实比较难,不太可能网工的学员去学这些知识点.而且这些知识点在网工考试中的出现频度是非常低,可能就考这一次,以后都不会去考了.因此,考生也不要太担心.这类题分值整体不高,也就是2-3分.如:●某文件系统采用位示图( bitmap)记录磁盘的使用情况.若计算机系统的字长为64位,磁盘的容量为1024GB,物理块的大小为4MB,那么位示图的大小

2019年上半年网络工程师考试下午试题分析

2019年上半年网络工程师考试下午试题结构分析1.大部分考生感觉题目非常偏,不如之前几次考试的常考知识点:其实整体来说,下午题并没有太难,只是考了一个不怎么常考的内容IPv6和Windows server 中的ipsec,如果复习中,对这两个部分没有特别留意,那确实是增加难度的.如:阅读以下说明 回答问题1至问题4,将解答填入答题纸对应的解务栏内.[说明]如图3-1所示在Windows Server 2008 R2网关上设置相应的IPSec策略,在Windows Server 2008 R2网关

2019 ICPC南昌邀请赛比赛过程及题解

解题过程 中午吃饭比较晚,到机房lfw开始发各队的账号密码,byf开始读D题,shl电脑卡的要死,启动中...然后听到谁说A题过了好多,然后shl让blf读A题,A题blf一下就A了.然后lfw读完M题(shl的电脑终于打开了,然后输入密码,密码错误...自闭),说AC 自动机板题,然后找板子,,,突然发现自己读错题目.后来不知道怎么A的.shl copy了一遍密码终于登上账号.然后lfw一个人用单调栈A掉了I题:byf 秒了H题: shl和byf读j题,读完吧题意告诉lfw,lfw说水题,然后