牛客:NC25138子串查询(字符串专题)

链接:NC25138子串查询

题面:

样例输入:

8 4
ababcbaa
abac
accb
aaaa
abcba

样例输出:

YES
NO
YES
YES

该代码中所有字符串以1为初始位置

nxt[i][j]数组表示s串中第i个字符之后(即不包括i)第一个出现j+'a'字符的位置。若不存在赋为-1.

那么在遍历t串的时候贪心的找到下一个字符的位置即可,如果在找到最后一个字符之前找到的是-1,说明不存在该子串

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+50;
int n,q;
char s[maxn],t[55];
int nxt[maxn][39];
queue<int> que[26];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n>>q>>s+1;
    for(int i=1;i<=n;i++){
        que[s[i]-'a'].push(i);
    }
    for(int i=0;i<26;i++){
        if(que[i].size())
            nxt[0][i]=que[i].front();
        else nxt[0][i]=-1;
    }
    for(int i=1;i<=n;i++){
        que[s[i]-'a'].pop();
        for(int j=0;j<26;j++){
            if(que[j].size()) nxt[i][j]=que[j].front();
            else nxt[i][j]=-1;
        }
    }
    while(q--){
        cin>>t+1;
        bool flag=true;
        for(int i=1,pos=0;i<=strlen(t+1);i++){
            pos=nxt[pos][t[i]-'a'];
            if(pos==-1){
                flag=false;
                break;
            }
        }
        if(!flag) puts("NO");
        else puts("YES");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值