贪心、字符串

判断是否符合要求的子序列不能找到,考虑贪心,由于每个位的可选范围固定,当前位越晚匹配,留有的余地就越小,整个子序列越不可能匹配成功。

对于子序列的每个位找最晚出现的字符,注意是找不同字符中下一次出现最晚的那个,也就是说对于 mondzd 这种字符串来说找到的应该是 z 而不是 d,这样才是对的。注意处理没找到目标字符的情况。

单组数据时间复杂度 $O(|s| \log |s|)$。

#include<bits/stdc++.h>
using namespace std;
int n,m,pos;
inline void ex(string &x){x.insert(x.begin(),'#');}
void solution(){
    set<int> w[30];
    string s,l,r;
    cin>>s>>m>>l>>r,pos=0,n=s.size();
    ex(s),ex(l),ex(r);
    for(int i=1;i<=n;i++) w[s[i]-'0'].emplace(i);
    for(int i=0;i<=9;i++) w[i].emplace(n+1);
    for(int i=1;i<=m;i++){
        int nxt=pos;
        for(int j=l[i];j<=r[i];j++) nxt=max(nxt,*w[j-'0'].upper_bound(pos));
        if(nxt==n+1) return puts("YES"),void();
        pos=nxt;
    }
    puts("NO");
}
int T;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>T;
    while(T--) solution();
    return 0;
}
最后修改:2024 年 07 月 17 日
如果觉得我的文章对你有用,请随意赞赏