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

Posted mmminoz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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");
    
View Code

 

 

以上是关于2019南昌邀请赛网络预选赛 M. Subsequence的主要内容,如果未能解决你的问题,请参考以下文章

ICPC中国南昌国家邀请赛和国际丝绸之路规划大赛预选赛 I J

2019 ACM - ICPC 全国邀请赛(南昌) 题解(9 / 12)

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

icpc 南昌邀请赛网络赛 Subsequence

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

2019ICPC南昌邀请赛现场赛A题 - Attack(斯坦纳树)