题目描述

给出一个长度为n的字符串s和q个查询。对于每一个查询,会输入一个字符串t,你需要判断这个字符串t是不是s的子串。子串的定义就是存在任意下标a<b<c<d<e,那么”s[a]s[b]s[c]s[d]s[e]”就构成s的一个子串。如”abc”的子串有”a”、”b”、”c”、”ab”、”ac”、”bc”、”abc”。

输入描述:

第一行两个数n,q。1<=n,q<=1e5。

第二行一个长度为n的字符串s,所有字符都为小写拉丁字符。

接下来q行每行一个字符串t。1<=|t|<=50。

输出描述:

对于每个查询,如果t是s的字串,输出”YES”,否则输出”NO”。每个答案占一行。
示例1

输入

复制

8 4
ababcbaa
abac
accb
aaaa
abcba

输出

复制

YES
NO
YES
YES ac代码:
方法一:
#include<bits/stdc++.h>
using namespace std;
int n,q,i,pos,f;
string s,a;
int main(){
    cin>>n>>q>>s;
    while(q--){
        cin>>a;
        pos=0;
        f=1;
        for(int i=0;i<a.length()&&f;i++){
            auto it = s.find(a[i],pos);
            if(it==s.npos) f=0;
            else
                pos = it+1;//要查找下一个,所以+1
        }
        if(f)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
     
    return 0;
}
 
解析:
方法原型 描述
size_type find(const string & str, size_type pos = 0) const 从字符串的pos位置开始,查找子字符串str。如果找到,则返回该子字符串首次出现时其首字符的索引;否则,返回string::npos
size_type find(const char * s, size_type pos = 0) const 从字符串的pos位置开始,查找子字符串s。如果找到,则返回该子字符串首次出现时其首字符的索引;否则,返回string::npos
size_type find(const char * s, size_type pos = 0, size_type n) const 从字符串的pos位置开始,查找s的前n个字符组成的子字符串。如果找到,则返回该子字符串首次出现时其首字符的索引;否则,返回string::npos
size_type find(const char ch, size_type pos = 0) const 从字符串的pos位置开始,查找字符ch。如果找到,则返回该子字符串首次出现的位置;否则,返回string::npos
 
 
方法二:

#include<bits/stdc++.h>
using namespace std;
int N,Q,a[30],n[30],b[100005][30];
string s;
int main(){
    cin>>N>>Q;
    cin>>s;
    int len = s.length();
    memset(n,-1,sizeof(n));
    for(int i = len-1;i>=0;i--){
        int x = s[i]-'a';//相当于把字符转换为数字a就是0,b就是1,以此类推
        for(int j=0;j<26;j++){
            b[i][j] = n[j];
        }
        n[x] = i;
    }
    for(int i=1;i<=Q;i++){
        string q;
        cin>>q;
        int cg = q.size();//这里我用q.length()就会超时;
        int iq = 0,is,cnt = 0;
        while(iq<len&&cnt<cg){
            if(cnt==0) iq = n[q[0]-'a'];
            else{
                if(b[iq][q[cnt]-'a']!=-1)
                    iq = b[iq][q[cnt]-'a'];
                else
                    break;
            }
            cnt++;    
        }
        if(cnt == cg) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }    
    return 0;
}

 
思路:
这个很巧
就拿这个例子来说:
 0 1 2 3 4 5 6 7
a b a b c b a a
a b a c
b[7][0 - 25]= -1; n[0]=7;

b[6][0] = 7;b[6][1-25]=-1; n[0]=6;

b[5][0]=6,b[5][1-25]=-1; n[1] = 5;

b[4][0]=6,b[4][1]=5,b[4][2-25]=-1; n[2] = 4;

//当遍历到c时,b[4][0]记录的是最先的a(0代表a)的位置,b[4][1]记录的是最先的b的位置
...
i从后往前是为了统计当从这个字母开始(不包括这个字母)后面的字母的位置,n中0就代表a,1就代表b,

然后这样就可以统计记录整个表的情况,如果是i从前遍历就不能做到

下面判断当cnt==0时要单独拿出来,就是因为当遍历到这个字母时,统计是不包括这个字母的。

b有len层,相当于在跳层的验证是否这个位置是存了数的,如果是-1就相当于没有这个数,就跳出循环输出NO。
 
 
 

牛客练习赛51 B 子串查询 https://ac.nowcoder.com/acm/contest/1083/B的更多相关文章

  1. 牛客练习赛51 C 勾股定理https://ac.nowcoder.com/acm/contest/1083/C

    题目描述 给出直角三角形其中一条边的长度n,你的任务是构造剩下的两条边,使这三条边能构成一个直角三角形. 输入描述: 一个整数n. 输出描述: 另外两条边b,c.答案不唯一,只要输出任意一组即为合理, ...

  2. 牛客练习赛51 **E-数列** (二分,贪心,构造)

    牛客练习赛51 E-数列 链接:https://ac.nowcoder.com/acm/contest/1083/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...

  3. 牛客练习赛51 D题

    链接:https://ac.nowcoder.com/acm/contest/1083/D来源:牛客网 有一个草原可以用一个1~400的数轴表示.有n头羊和q个查询.每头羊的编号分别是1,2,3…n. ...

  4. 牛客练习赛51 C 勾股定理 (数学,结论)

    链接:https://ac.nowcoder.com/acm/contest/1083/C来源:牛客网 题目描述 给出直角三角形其中一条边的长度n,你的任务是构造剩下的两条边,使这三条边能构成一个直角 ...

  5. 牛客练习赛51 C 勾股定理

    链接:https://ac.nowcoder.com/acm/contest/1083/C 题目描述 给出直角三角形其中一条边的长度n,你的任务是构造剩下的两条边,使这三条边能构成一个直角三角形. 输 ...

  6. 牛客-https://www.nowcoder.com/acm/contest/96/H

    链接:https://www.nowcoder.com/acm/contest/96/H来源:牛客网 题目描述 今天qwb要参加一个数学考试,这套试卷一共有n道题,每道题qwb能获得的分数为ai,qw ...

  7. 牛客练习赛51 A abc

    A. abc 题意: 给出一个字符串s,你需要做的是统计s中子串”abc”的个数.子串的定义就是存在任意下标a<b<c,那么”s[a]s[b]s[c]”就构成s的一个子串.如”abc”的子 ...

  8. 牛客练习赛52 B题【树状数组维护区间和{查询区间和,如果区间元素重复出现则计数一次}】补题ing

    [题目] 查询区间和,如果区间元素重复出现则计数一次. 链接:https://ac.nowcoder.com/acm/contest/1084/B [题解] 将询问按r排序,维护每个数最后出现的位置, ...

  9. 牛客练习赛33 E tokitsukaze and Similar String (字符串哈希hash)

    链接:https://ac.nowcoder.com/acm/contest/308/E 来源:牛客网 tokitsukaze and Similar String 时间限制:C/C++ 2秒,其他语 ...

随机推荐

  1. 【LCT维护子树信息】uoj207 共价大爷游长沙

    这道题思路方面就不多讲了,主要是通过这题学一下lct维护子树信息. lct某节点u的子树信息由其重链的一棵splay上信息和若干轻儿子子树信息合并而成. splay是有子树结构的,可以在rotate, ...

  2. UML指南系列——活动图

    活动图用来描述传统意义上的流程图

  3. hduoj-1301 Jungle Roads(最小生成树-克鲁斯卡尔和普里姆求解)

    普里姆求解: #include<cstdio> #include<cmath> #include<cstring> #include<iostream> ...

  4. 【题解】Ride to Office

    题目描述 起点与终点相隔4500米.现Charley 需要从起点骑车到终点.但是,他有个习惯,沿途需要有人陪伴,即以相同的速度, 与另外一个人一起骑.而当他遇到以更快的速度骑车的人时,他会以相应的速度 ...

  5. tonight i need your body

    wdnmd wdnmd 再lable中我们有几个不同的type参数: text     写的是文本类型的参数 password    不管输入的是什么显示的都是星星 date    输入的是一个日历本 ...

  6. Activity 通知

    //通知图标 int icon = android.R.drawable.stat_notify_chat; //创建通知对象,icon通知图标,tickerText摘要,System.current ...

  7. ssh-keyscan - 收集 ssh 公钥

    总览 (SYNOPSIS) ssh-keyscan -words [-v46 ] [-p port ] [-T timeout ] [-t type ] [-f file ] [host | addr ...

  8. AtCoder Beginner Contest 127 D,E,F

    D Integer Cards 题意:先给出n个数字,然后可以有m次操作,每次操作以数字对(x,y)表示最多能选x个数字把它变成y,问经历m次操作后n个数字和最大为多少? 解法:一个明显正确的做法是: ...

  9. Codeforces 745E Hongcow Buys a Deck of Cards 状压DP / 模拟退火

    题意:现在有n张卡片(n <= 16), 每一轮你可以执行两种操作中的一种.1:获得一张红色令牌和一张蓝色令牌.2:购买一张卡片(如果可以买的话),购买的时候蓝色卡片可以充当蓝色令牌,红色同理, ...

  10. Codeforces 1169E DP

    题意:给你一个长度为n的序列,有q次询问,每次询问给出两个位置x和y(x < y),问是否可从x到达y?可达的定义是:如果存在一个序列(假设长度为k),其中p1 = x, pk = y,并且这个 ...